Python-Pandas GroupBy 进阶与透视表学习
一、数据分组(GroupBy)
核心概念:将数据按指定字段分组,对每组进行聚合、转换或过滤操作。
1. 分组聚合(Aggregation)
将分组数据聚合成单个值(如平均值、总和)。
单变量分组聚合:
import pandas as pd df = pd.read_csv('data/gapminder.tsv', sep='\t') # 按年份分组计算平均寿命 result = df.groupby('year')['lifeExp'].mean()
Pandas内置聚合方法:
count()
,mean()
,std()
,median()
,sum()
,min()
,max()
等。示例:
df.groupby('continent')['lifeExp'].describe() # 同时计算多个统计量
自定义聚合函数:
def my_mean(values): return sum(values) / len(values) # 使用agg调用自定义函数 df.groupby('year')['lifeExp'].agg(my_mean)
多函数聚合:
result = df.groupby('year')['lifeExp'].agg(['count', 'mean', 'std']) # 重命名结果列 result.columns = ['count_nonzero', 'mean', 'std']
多列不同聚合操作:
df.groupby('year').agg({ 'lifeExp': 'mean', 'pop': 'median', 'gdpPercap': 'median' }).rename(columns={ 'lifeExp': '平均寿命', 'pop': '人口', 'gdpPercap': '人均Gdp' }).reset_index()
2. 分组转换(Transformation)
保持数据维度不变,对每组进行转换(如标准化、填充缺失值)。
计算Z分数:
def my_zscore(x): return (x - x.mean()) / x.std() df['z_score'] = df.groupby('year')['lifeExp'].transform(my_zscore)
分组填充缺失值:
tips = pd.read_csv('data/tips.csv').sample(10, random_state=42) tips.loc[np.random.permutation(tips.index)[:4], 'total_bill'] = np.NaN # 构造缺失值 def fill_na_mean(x): return x.fillna(x.mean()) # 用组内均值填充缺失值 tips['fill_total_bill'] = tips.groupby('sex')['total_bill'].transform(fill_na_mean)
3. 分组过滤(Filtration)
根据条件筛选分组(如删除组内数据量不足的分组)。
# 过滤组内数据量>30的分组
tips_filtered = tips.groupby('size').filter(lambda x: len(x) > 30)
tips_filtered['size'].value_counts()
4. DataFrameGroupBy对象操作
分组后返回DataFrameGroupBy
对象,支持进一步操作。
查看分组:
grouped = tips.groupby('sex') grouped.groups # 显示分组索引 female_group = grouped.get_group('Female') # 提取特定组
遍历分组:
for name, group in grouped: print(f"Group: {name}") print(group.head())
多字段分组:
group_avg = tips.groupby(['sex', 'time']).mean() # 返回MultiIndex group_avg.reset_index() # 转换为普通DataFrame # 或分组时禁用索引 tips.groupby(['sex', 'time'], as_index=False).mean()
二、数据透视表(Pivot Table)
动态重组数据,按行列维度聚合分析。
核心参数
参数 | 作用 | 示例 |
---|---|---|
| 行分组字段 |
|
| 列分组字段 |
|
| 待聚合的数值列 |
|
| 聚合函数(默认 |
|
基础用法
# 按大洲和年份透视平均寿命
pivot = pd.pivot_table( df, index='continent', columns='year', values='lifeExp', aggfunc='mean'
)
多维度聚合
# 同时计算均值和标准差
pivot_multi = pd.pivot_table( df, index='continent', columns='year', values='lifeExp', aggfunc=['mean', 'std']
)
三、关键区别总结
操作 | 输入 | 输出 | 特点 |
---|---|---|---|
聚合(Agg) | 每组数据 | 单个值(如均值) | 数据维度降低 |
转换(Transform) | 每组数据 | 同维度数据(如Z分数) | 维度不变,支持向量化操作 |
过滤(Filter) | 整组数据 | 筛选后的组(如删除小组) | 按组条件筛选 |
透视表 | 全表数据 | 重组后的聚合表 | 动态行列分析,支持多级分组 |
四、最佳实践
分组前预处理:确保分组字段无缺失值。
优先内置函数:如
mean()
比自定义循环高效。透视表替代多重分组:简化多维度聚合代码。
利用
reset_index()
:将分组索引转换为列便于后续分析。
示例代码需结合实际数据文件运行,建议在Jupyter Notebook中逐步练习以加深理解。