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
相关产品推荐
相关产品推荐

