Python中DataFrame运算全面总结教程
什么是DataFrame?
DataFrame是Pandas库中最核心的数据结构,它是一个二维标签化数据结构,类似于Excel表格或SQL数据表。DataFrame可以存储多种类型的数据,并提供了丰富的数据操作方法,是Python数据分析的核心工具。
一、创建DataFrame
创建DataFrame的几种常用方法:
import pandas as pd
import numpy as np
# 从字典创建
data = {'姓名': ['张三', '李四', '王五'],
'年龄': [25, 30, 35],
'城市': ['北京', '上海', '广州']}
df = pd.DataFrame(data)
# 从列表创建
data = [['张三', 25, '北京'],
['李四', 30, '上海'],
['王五', 35, '广州']]
df = pd.DataFrame(data, columns=['姓名', '年龄', '城市'])
# 创建带日期索引的DataFrame
dates = pd.date_range('20230101', periods=6)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
二、基本运算
1. 算术运算
DataFrame支持基本的算术运算(+、-、*、/),可以针对整个DataFrame、列或元素进行操作。
# 创建示例DataFrame
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
# 整个DataFrame加常数
df + 10
# DataFrame之间相加
df2 = pd.DataFrame({'A': [10, 20, 30], 'B': [40, 50, 60], 'C': [70, 80, 90]})
df + df2
# 单列运算
df['A'] * 5
# 使用apply函数进行复杂运算
df.apply(lambda x: x * 2 if x.name == 'B' else x)
2. 统计计算
DataFrame提供了丰富的统计计算方法:
# 基本统计
df.sum() # 列求和
df.mean() # 列平均值
df.median() # 列中位数
df.std() # 列标准差
df.min() # 列最小值
df.max() # 列最大值
df.describe() # 综合统计信息
# 行统计
df.sum(axis=1) # 行求和
# 累积计算
df.cumsum() # 累积和
df.cumprod() # 累积积
# 相关系数和协方差
df.corr() # 列之间的相关系数
df.cov() # 列之间的协方差
三、数据筛选与过滤
根据条件筛选DataFrame中的数据:
# 单条件筛选
df[df['年龄'] > 30]
# 多条件筛选
df[(df['年龄'] > 25) & (df['城市'] == '上海')]
# 使用query方法
df.query("年龄 > 25 and 城市 == '上海'")
# 使用isin筛选
df[df['城市'].isin(['北京', '广州'])]
# 筛选特定列
df.loc[df['年龄'] > 30, ['姓名', '城市']]
四、数据合并与连接
1. concat合并
# 垂直合并(增加行)
df1 = pd.DataFrame({'A': ['A0', 'A1'], 'B': ['B0', 'B1']})
df2 = pd.DataFrame({'A': ['A2', 'A3'], 'B': ['B2', 'B3']})
result = pd.concat([df1, df2])
# 水平合并(增加列)
result = pd.concat([df1, df2], axis=1)
2. merge连接
left = pd.DataFrame({'key': ['K0', 'K1', 'K2'], 'A': ['A0', 'A1', 'A2']})
right = pd.DataFrame({'key': ['K0', 'K1', 'K3'], 'B': ['B0', 'B1', 'B3']})
# 内连接
pd.merge(left, right, on='key')
# 左连接
pd.merge(left, right, on='key', how='left')
# 右连接
pd.merge(left, right, on='key', how='right')
# 外连接
pd.merge(left, right, on='key', how='outer')
3. join连接
# 索引连接
left = pd.DataFrame({'A': ['A0', 'A1', 'A2']}, index=['K0', 'K1', 'K2'])
right = pd.DataFrame({'B': ['B0', 'B1', 'B2']}, index=['K0', 'K2', 'K3'])
left.join(right) # 左连接
left.join(right, how='outer') # 外连接
五、分组与聚合
groupby是DataFrame中强大的分组聚合工具:
# 创建示例数据
data = {'城市': ['北京', '上海', '广州', '北京', '上海'],
'销售额': [10000, 15000, 9000, 12000, 18000],
'产品': ['A', 'B', 'A', 'B', 'A']}
df = pd.DataFrame(data)
# 单列分组
grouped = df.groupby('城市')
grouped.mean() # 计算每组的平均值
# 多列分组
df.groupby(['城市', '产品']).sum()
# 对不同的列应用不同的聚合函数
df.groupby('城市').agg({'销售额': ['sum', 'mean'], '产品': 'count'})
# 使用自定义聚合函数
def range_func(x):
return x.max() - x.min()
df.groupby('城市').agg(range_func)
六、数据排序
# 按单列排序
df.sort_values('销售额', ascending=False)
# 按多列排序
df.sort_values(['城市', '销售额'], ascending=[True, False])
# 按索引排序
df.sort_index(ascending=False)
七、处理缺失值
# 创建带缺失值的DataFrame
df = pd.DataFrame({'A': [1, 2, np.nan], 'B': [5, np.nan, np.nan], 'C': [1, 2, 3]})
# 检测缺失值
df.isnull()
# 删除包含缺失值的行
df.dropna()
# 填充缺失值
df.fillna(0) # 用0填充
df.fillna(df.mean()) # 用列均值填充
df.fillna(method='ffill') # 前向填充
八、应用函数
# 应用函数到每个元素
df.applymap(lambda x: x*2)
# 应用函数到列
df.apply(lambda col: col.max() - col.min())
# 应用函数到行
df.apply(lambda row: row['A'] + row['B'], axis=1)
# 使用transform改变值但保持形状
df.groupby('城市')['销售额'].transform(lambda x: x - x.mean())
# 使用pipe进行链式操作
(df.pipe(lambda d: d[d['城市'] == '北京'])
.pipe(lambda d: d.sort_values('销售额', ascending=False)))
九、时间序列操作
# 创建时间序列数据
date_rng = pd.date_range(start='2023-01-01', end='2023-01-10', freq='D')
df = pd.DataFrame(date_rng, columns=['date'])
df['data'] = np.random.randn(len(date_rng))
# 设置日期索引
df.set_index('date', inplace=True)
# 时间重采样
df.resample('3D').mean() # 每3天平均值
# 滚动窗口计算
df.rolling(window=3).mean() # 3天移动平均
# 时间偏移
df.shift(1) # 数据向前移动一天
十、高效运算技巧
- 向量化操作: 尽量使用内置的向量化操作而不是循环
- 使用eval(): 对于大型DataFrame,eval()可以加速运算
- 避免链式索引: 使用loc/iloc避免SettingWithCopy警告
- 使用分类数据类型: 对有限取值的字符串列使用category类型节省内存
- 使用query: 对于复杂过滤条件,query方法通常更高效
总结
DataFrame提供了丰富而强大的数据操作功能,涵盖了从基本运算到高级处理的各种场景。掌握这些操作可以极大提高数据处理效率:
- 基本运算是DataFrame处理的基础
- 数据合并与连接是整合多源数据的关键
- 分组聚合是数据分析的核心技术
- 时间序列处理在金融、物联网等领域应用广泛
- 高效运算技巧能显著提升处理大型数据集的性能
通过灵活运用这些DataFrame操作,您可以高效地完成各种复杂的数据处理和分析任务。
发表评论