如何用Pandas分组并为每个分组值生成对应列实现宽表转换?
Pandas垂直表转宽表实现方法
要实现把垂直结构的DataFrame按posteam分组,将每个offense_grouping对应的snap_ct和personnel_epa转为前缀带分组值的独立列,最终每个posteam仅保留一行,可以用Pandas的pivot或pivot_table方法,步骤如下:
1. 基础实现(无重复分组)
假设你的原始DataFrame名为df,结构类似:
| posteam | offense_grouping | snap_ct | personnel_epa |
|---|---|---|---|
| ARI | 00 | 22 | 0.45 |
| ARI | 01 | 18 | 0.32 |
| ARI | 02 | 30 | 0.61 |
| ARI | 03 | 15 | 0.28 |
| ARI | 04 | 25 | 0.53 |
执行以下代码:
# 透视转换:以posteam为行,offense_grouping为列,指定要转换的数值列 wide_df = df.pivot(index='posteam', columns='offense_grouping', values=['snap_ct', 'personnel_epa']) # 合并多级列名,生成"personnel_分组值_字段名"的格式 wide_df.columns = [f'personnel_{col[1]}_{col[0]}' for col in wide_df.columns] # 可选:把posteam从索引转回普通列 wide_df = wide_df.reset_index()
执行后得到的宽表结构会是:
| posteam | personnel_00_snap_ct | personnel_00_personnel_epa | personnel_01_snap_ct | ... | personnel_04_personnel_epa |
|---|---|---|---|---|---|
| ARI | 22 | 0.45 | 18 | ... | 0.53 |
2. 处理重复分组(同一posteam+offense_grouping有多行)
如果原始数据中存在同一个posteam和offense_grouping组合对应多行数据,需要用pivot_table指定聚合规则(比如求和、取均值):
# 用sum聚合重复值,可根据需求换成'mean'/'max'等 wide_df = df.pivot_table( index='posteam', columns='offense_grouping', values=['snap_ct', 'personnel_epa'], aggfunc='sum' ) # 同样处理列名和索引 wide_df.columns = [f'personnel_{col[1]}_{col[0]}' for col in wide_df.columns] wide_df = wide_df.reset_index()
关键逻辑说明
pivot/pivot_table负责将行维度的offense_grouping转为列维度,同时映射对应的snap_ct和personnel_epa值- 列名合并时,
col[1]取的是offense_grouping的分组值,col[0]取的是原始字段名(snap_ct/personnel_epa),按需求拼接成目标格式
内容的提问来源于stack exchange,提问作者jwald3
相关产品推荐
相关产品推荐

