Python Pandas分组函数案例详解

241 阅读4分钟

更多学习内容:ipengtao.com

Pandas的groupby函数是数据分析和处理中的重要工具,允许按照指定的列对数据进行分组,并在每个组内执行相应的操作。本文将详细介绍groupby函数的使用方法,并提供丰富的示例代码,覆盖从基础用法到高级操作的多个方面。

1. 基础用法

1.1 分组并计算统计量

import pandas as pd

# 创建示例DataFrame
data = {'Category': ['A', 'B', 'A', 'B', 'A', 'B'],
        'Value': [10, 20, 15, 25, 18, 30]}
df = pd.DataFrame(data)

# 按Category分组,并计算每组的平均值
grouped = df.groupby('Category')
result = grouped.mean()

print(result)

1.2 多列分组

# 多列分组,并计算每组的总和
result_multi = df.groupby(['Category', 'Value']).sum()

print(result_multi)

2. 聚合函数和变换

2.1 自定义聚合函数

# 自定义聚合函数
def custom_agg(x):
    return x.max() - x.min()

# 应用自定义聚合函数
result_custom_agg = df.groupby('Category')['Value'].agg(custom_agg)

print(result_custom_agg)

2.2 变换操作

# 对每个组进行变换操作,计算与均值的差值
df['Value_diff'] = df.groupby('Category')['Value'].transform(lambda x: x - x.mean())

print(df)

3. 过滤操作

# 过滤出平均值大于15的组
result_filter = df.groupby('Category').filter(lambda x: x['Value'].mean() > 15)

print(result_filter)

4. 高级操作

4.1 分组的迭代

# 分组的迭代操作
for name, group in df.groupby('Category'):
    print(f"Category: {name}")
    print(group)

4.2 多函数应用

# 对不同列应用不同的聚合函数
result_multi_func = df.groupby('Category').agg({'Value': 'sum', 'Value_diff': 'mean'})

print(result_multi_func)

5. 分组的排序和处理缺失值

5.1 分组排序

# 按值排序每个组
result_group_sort = df.groupby('Category').apply(lambda x: x.sort_values('Value'))

print(result_group_sort)

5.2 处理缺失值

# 处理缺失值,使用均值填充
df_missing = pd.DataFrame({'Category': ['A', 'A', 'B', 'B', 'C', 'C'],
                            'Value': [10, None, 15, 25, None, 30]})

result_fillna = df_missing.groupby('Category')['Value'].apply(lambda x: x.fillna(x.mean()))

print(result_fillna)

6. 多级索引(MultiIndex)

6.1 创建多级索引

# 创建具有多级索引的DataFrame
df_multiindex = df.set_index(['Category', df.groupby('Category').cumcount()])

print(df_multiindex)

6.2 多级索引的聚合

# 多级索引的聚合操作
result_multiindex_agg = df_multiindex.groupby('Category').agg({'Value': 'sum', 'Value_diff': 'mean'})

print(result_multiindex_agg)

7. 分组的时间处理

7.1 时间序列分组

# 创建时间序列数据
date_rng = pd.date_range('2023-01-01', '2023-01-06', freq='D')
df_time = pd.DataFrame({'Date': date_rng, 'Value': [10, 20, 15, 25, 18, 30]})

# 按周分组,并计算每组的平均值
result_time_group = df_time.groupby(df_time['Date'].dt.week)['Value'].mean()

print(result_time_group)

7.2 时间窗口处理

# 使用时间窗口处理数据
result_time_window = df_time.groupby(df_time['Date'].dt.to_period('D')).sum()

print(result_time_window)

8. 分组的透视表和交叉表

8.1 透视表

# 创建透视表,计算每个组的平均值
pivot_table_result = pd.pivot_table(df, values='Value', index='Category', aggfunc='mean')

print(pivot_table_result)

8.2 交叉表

# 创建交叉表,计算每组的频数
cross_tab_result = pd.crosstab(df['Category'], df['Value'] > 20)

print(cross_tab_result)

9. 性能优化

9.1 使用agg替代apply

# 使用agg替代apply,提高性能
result_agg = df.groupby('Category').agg({'Value': ['sum', 'mean'], 'Value_diff': 'std'})

print(result_agg)

9.2 分组后直接计算

# 分组后直接计算,避免多次扫描数据
result_direct_calculation = df.groupby('Category')['Value'].sum()

print(result_direct_calculation)

10. 分组的合并与拼接

10.1 分组合并

# 分组合并,将分组计算的结果合并到原始数据
merge_result = pd.merge(df, result_agg, on='Category')

print(merge_result)

10.2 分组拼接

# 分组拼接,将分组计算的结果拼接到原始数据
concat_result = pd.concat([df, result_agg], axis=1, join='inner')

print(concat_result)

总结

本文详细探讨了Pandas中的groupby函数,涵盖了从基础到高级的多个方面。通过基础用法的介绍,学会如何进行简单的分组和统计操作。深入到聚合函数和变换,展示了如何灵活运用自定义聚合函数和变换操作,使得分组的处理更加精细化。过滤操作的示例展示了根据分组特性筛选数据的实用技巧。

高级操作部分介绍了分组的排序、处理缺失值、多级索引、时间处理等复杂场景下的应用方法,使得大家能够更灵活地处理各类数据。透视表和交叉表的使用进一步提高了对数据的可视化和洞察力。性能优化技巧则更高效地处理大规模数据。

最后,分组的合并与拼接展示了如何将分组计算的结果整合到原始数据中,使得分析更加全面。整篇文章通过丰富的示例代码和详细的解释,为大家提供了全方位的学习体验,使其能够熟练运用groupby函数进行数据分析,提高工作效率。掌握了这些Pandas分组的技巧,将更自如地处理各类数据集,适应不同的分析场景。


Python学习路线

更多学习内容:ipengtao.com

Python基础知识.png