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

Pandas groupby双字段后将第二个分组层级转为列的实现方法

pandas多级分组结果转宽表实现方法

你需要的长表转宽表效果有多种实现方式,以下是可直接运行的方案:


方案1:直接用pivot_table一步完成统计+转宽表

不需要提前做groupby操作,直接通过pivot_table同时完成分组统计和格式转换:

import pandas as pd
data = {"Team": ["Red Sox", "Red Sox", "Red Sox", "Red Sox", "Red Sox", "Red Sox", "Yankees", "Yankees", "Yankees", "Yankees", "Yankees", "Yankees"],
        "Pos": ["Pitcher", "Pitcher", "Pitcher", "Not Pitcher", "Not Pitcher", "Not Pitcher", "Pitcher", "Pitcher", "Pitcher", "Not Pitcher", "Not Pitcher", "Not Pitcher"],
        "Age": [24, 28, 40, 22, 29, 33, 31, 26, 21, 36, 25, 31]}
df = pd.DataFrame(data)

# 生成宽表
res = pd.pivot_table(
    df,
    index='Team',  # 保留为行的字段
    columns='Pos', # 转为列的字段
    values='Age',  # 统计的目标字段
    aggfunc='count' # 统计逻辑为计数
).reset_index() # 把Team从索引转为普通列

# 把列名里的空格替换为下划线,匹配你要的输出格式
res.columns = res.columns.str.replace(' ', '_')
print(res)

方案2:基于已有的groupby统计结果转换

如果你已经生成了分组后的4行统计结果,可以用pivot直接转换:

# 你已有的分组统计代码
grouped = df.groupby(['Team','Pos'])['Age'].count().reset_index()

# 转换为宽表
res = grouped.pivot(index='Team', columns='Pos', values='Age').reset_index()
res.columns = res.columns.str.replace(' ', '_')
print(res)

方案3:用crosstab快速实现计数类转宽表

需求是统计数量的场景下,crosstab是更简洁的写法:

res = pd.crosstab(index=df['Team'], columns=df['Pos']).reset_index()
res.columns = res.columns.str.replace(' ', '_')
print(res)

以上三种方案运行后输出结果均符合要求:

Team  Not_Pitcher  Pitcher
0   Red Sox            3        3
1  Yankees            3        3

内容的提问来源于stack exchange,提问作者moth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:45:05