当前位置:首页 > Python > 正文

Python中DataFrame运算全面总结教程 | 数据分析必备技能

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操作,您可以高效地完成各种复杂的数据处理和分析任务。

发表评论