Pandas
约 1780 字大约 6 分钟
2025-10-03
DataFrame对象基本操作
Dataframe是pandas的核心数据结构,他是一个表格型数据结构,类似于Excel表格。
import pandas as pd
df = pd.DataFrame({'Name': ['Alice', 'Bob', 'Charlie'],
'Age': [25, 30, 35],
'City': ['New York', 'Paris', 'London']})查看数据
df.head(num) # 查看前num行数据 df.tail(num) # 查看后num行数据 df.shape # 查看DataFrame的形状,返回一个元组 (行数, 列数) df.info() # 查看DataFrame的基本信息,包括数据类型、非空值数量 df.describe() # 查看DataFrame的统计信息,包括计数、均值、标准差、最小值、最大值等 df.columns # 获取DataFrame的列名选择数据
df['new_column'] = value # 添加新列 df['Age'] # 选择单列 df[['Name', 'Age']] # 选择多列 df.loc['Age'] # 使用列明选择数据 df.iloc[0] # 使用位置索引选择数据 df[df['Age'] > 30] # 使用条件选择数据修改数据
df['New_Column'] = values # 添加新列 df.drop('Column',axis=1) # 删除列 df.rename(columns={'Old_Name': 'New_Name'}) # 重命名列数据处理
df.sort_values(by='Age') # 按照某列排序 df.groupby('City').mean() # 分组聚合 df.isnull() # 检查缺失值 df.fillna(value) # 填充缺失值
创建DataFrame
pd.DataFrame() 是 Pandas 中用于创建 DataFrame 的核心构造函数,下面详细介绍其参数和使用方法。
函数签名
import pandas as pd pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)参数说明
data:可以是多种类型的数据结构,如列表、字典、NumPy数组等。index:可选参数,用于指定行索引。默认会自动生成整数索引。columns:可选参数,用于指定列名。默认使用整数索引作为列名。dtype:可选参数,用于指定 DataFrame 中数据的类型。默认根据数据自动推断类型。copy:布尔值,默认为 False。如果为 True,则会复制数据,而不是引用原始数据。
示例
import pandas as pd # 指定索引和列名 df = pd.DataFrame( data={'成绩': [90, 85, 78]}, index=['张三', '李四', '王五'], columns=['成绩'] ) # 指定数据类型 df = pd.DataFrame( data={ 'A': pd.Series([1, 2, 3]), 'B': pd.Categorical(['a', 'b', 'a']), 'C': ['x', 'y', 'z'] }, dtype={'A': 'float32', 'C': 'category'} )
DataFrame索引(切片)
DataFrame的索引有列索引和行索引两种,均支持切片操作。
列索引
df['column_name'] # 选择单列 df[['col1', 'col2']] # 选择多列行索引
df.loc['index_name'] # 使用行标签选择单行 df.loc[['index1', 'index2']] # 使用行标签选择多行 df.iloc[0] # 使用行下标选择第一行 df.iloc[1:3] # 使用行下标选择第二行到第三行(不包括第四行) df[df['column_name'] > value] # 使用条件选择行混合索引 使用
:进行切片,使用,进行混合筛选df.loc['index_name', 'column_name'] # 选择特定行和列 df.iloc[0:2, 1:3] # 选择前两列和第二到第三行位置的数据
分组聚合
在pandas中,groupby()操作返回一个GroupBy对象,可以对数据进行分组聚合操作。常用的聚合函数包括mean()、sum()、count()等。
- 函数签名
DataFrame.groupby(by=None,
axis=0,
level=None,
as_index=True,
sort=True,
group_keys=True,
squeeze=False,
observed=False,
dropna=True)参数类型
by:用于指定分组的列,可以是列名、列名列表、与DataFrame长度相同的数组或Series或函数。axis:用于指定分组的轴,默认为0(按行分组)。level:用于指定分组的层级,仅在多级索引时使用。as_index:True -> 分组列将成为groupby对象的索引sort:用于指定是否对分组结果进行排序,默认为True。group_keys:当调用apple时,是否将分组键添加到索引以识别片段squeeze:如果结果是单列或单行,是否将其转换为Series。observed:仅在分组变量是Categorical(分类类型)时使用,默认为False,表示包括所有类别;如果为True,则仅包括在数据中出现的类别。dropna:用于指定是否在分组时抛弃NA值,默认为True。
基本统计方法
mean():计算均值sum():计算总和count():计算非空值数量min():计算最小值idxmin():计算最小值的索引max():计算最大值idxmax():计算最大值的索引std():计算标准差var():计算方差
其他聚合方法
agg():可以对不同列应用不同的聚合函数import pandas as pd df = pd.DataFrame({ 'A': ['foo', 'bar', 'foo', 'bar'], 'B': [1, 2, 3, 4], 'C': [5, 6, 7, 8] }) df.groupby('A').agg({'B': 'sum', 'C': 'mean'}) df.groupby('A').agg(['mean', 'sum', 'count'])apply(func):可以对分组后的数据应用自定义函数df.groupby('A').apply(lambda x: x['B'].sum())transform(func):对分组后的数据进行转换,返回与原数据相同形状的结果df.groupby('key')['value'].transform(lambda x: x - x.mean())
使用示例
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B': ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C': np.random.randn(8),
'D': np.random.randn(8)
})
# 基本分组
grouped = df.groupby('A')
# 多列分组
multi_grouped = df.groupby(['A', 'B'])
# 使用函数分组
func_grouped = df.groupby(lambda x: x % 2) # 按索引奇偶分组
# 分组后不将分组列作为索引
not_indexed = df.groupby('A', as_index=False).mean()
# 不排序分组键
unsorted = df.groupby('A', sort=False).sum()
# 处理分类数据和NA值
df_with_cats = df.copy()
df_with_cats['A'] = pd.Categorical(df['A'], categories=['foo', 'bar', 'baz'])
df_with_cats.loc[3, 'A'] = np.nan
cat_grouped = df_with_cats.groupby('A', observed=True, dropna=False).count()数据透视表
数据透视表是用于对数据进行汇总、分析和可视化的强大工具。在pandas中,可以使用pivot_table()函数创建数据透视表。
- 函数签名
DataFrame.pivot_table(values=None,
index=None,
columns=None,
aggfunc='mean',
fill_value=None,
margins=False,
dropna=True)参数说明
values:用于指定要汇总的列。index:用于指定行索引。columns:用于指定列索引。aggfunc:用于指定汇总函数,默认为mean。fill_value:用于指定缺失值填充的值。margins:布尔值,默认为False,表示是否添加边际统计。dropna:布尔值,默认为True,表示是否丢弃缺失值。
示例
import pandas as pd
import numpy as np
df = pd.DataFrame({
'A': ['foo', 'bar', 'foo', 'bar'],
'B': ['one', 'one', 'two', 'two'],
'C': np.random.randn(4),
'D': np.random.randn(4)
})
# 创建数据透视表
pivot = df.pivot_table(values='C', index='A', columns='B', aggfunc='mean')字符串操作
在pandas中,可以使用字符串方法对Series中的字符串数据进行操作。常用的字符串方法包括str.lower()、str.upper()、str.contains()等。
- 示例
import pandas as pd
df = pd.DataFrame({
'A': ['foo', 'bar', 'baz'],
'B': ['one', 'two', 'three']
})
# 转换为小写
df['A'].str.lower()
# 转换为大写
df['B'].str.upper()
# 显示每个字符串的长度
df['B'].str.len()
# 去除空格
df['B'].str.strip()
df['B'].str.lstrip() # 去除左空格
df['B'].str.rstrip() # 去除右空格
# 检查是否包含子串
df['B_contains_e'] = df['B'].str.contains('e')
# 检查是否以特定子串开头
df['B_starts_with_t'] = df['B'].str.startswith('t')
# 检查是否以特定子串结尾
df['B_ends_with_e'] = df['B'].str.endswith('e')时间序列操作
import pandas as pd
import datetime
dt = datetime.datetime(year=2017, month=11, day=24, hour=10, minute=30)
dt # datatime.datatime(2017, 11, 24, 10, 30)
ts = pd.Timestamp(dt) # 转换为pandas的时间戳对象
ts # Timestamp('2017-11-24 10:30:00')
ts.month() # 11
ts.day() # 24
ts.hour() # 10
ts.minute() # 30
# pd的Timestamp对象可以直接进行时间运算
ts + pd.Timedelta('5 days')
ts # Timestamp('2017-11-29 10:30:00')
pd.to_datetime('2017-11-24 10:30:00') # Timestamp('2017-11-24 10:30:00')
s = pd.Series(pd.date_range('2017-11-24', periods=5, freq='D'))
s
# 0 2017-11-24
# 1 2017-11-25
# 2 2017-11-26
# 3 2017-11-27
# 4 2017-11-28
# dtype: datetime64[ns]