You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Pandas分组并为每个分组值生成对应列实现宽表转换?

Pandas垂直表转宽表实现方法

要实现把垂直结构的DataFrame按posteam分组,将每个offense_grouping对应的snap_ct和personnel_epa转为前缀带分组值的独立列,最终每个posteam仅保留一行,可以用Pandas的pivot或pivot_table方法,步骤如下:

1. 基础实现(无重复分组)

假设你的原始DataFrame名为df,结构类似:

posteamoffense_groupingsnap_ctpersonnel_epa
ARI00220.45
ARI01180.32
ARI02300.61
ARI03150.28
ARI04250.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()

执行后得到的宽表结构会是:

posteampersonnel_00_snap_ctpersonnel_00_personnel_epapersonnel_01_snap_ct...personnel_04_personnel_epa
ARI220.4518...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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:20:29