如何在Pandas透视表的索引中统计唯一值并保留原有聚合结果?
如何在Pandas透视表的索引中统计唯一值并保留原有聚合结果?
嘿,我明白你的需求啦——既要保留原来按球员+球队分组、按比赛汇总得分的透视表,又要额外统计每个球员总共效力过多少支不同的球队,对吧?其实你之前提到的nunique()完全可以处理字符串类型的,只是需要换个方式来用~
我给你两种可行的方案,你可以根据自己的习惯选:
方案一:先做透视表,再合并球队统计数
- 先单独计算每个球员的唯一球队数量:
# 按player分组,统计每个player对应的team唯一值数量,并重命名列名 team_count = df.groupby('player')['team'].nunique().rename('unique_teams')
- 生成你原本需要的透视表:
pivot = pd.pivot_table(df, index=['player', 'team'], columns='game', values='score', aggfunc='sum', fill_value='')
- 将球队统计数合并到透视表中:
# 利用join方法,通过player这个索引层级合并数据 result = pivot.join(team_count, on='player')
这样得到的结果里,每一行都会显示对应球员的总唯一球队数,同时保留了原来按比赛汇总的得分数据——比如James的每一行都会显示unique_teams=3,Henry的每一行显示2,完全符合你的要求。
方案二:先给原数据添加统计列,再生成透视表
如果你想一步到位,也可以先给原数据集加上每个球员的唯一球队数,再做透视表:
# 用map方法给每一行匹配对应player的唯一球队数 df['unique_teams'] = df['player'].map(df.groupby('player')['team'].nunique()) # 生成透视表时,同时聚合score和unique_teams——因为同一player的unique_teams是固定值,用first/max都可以 pivot = pd.pivot_table(df, index=['player', 'team'], columns='game', values=['score', 'unique_teams'], aggfunc={'score': 'sum', 'unique_teams': 'first'}, fill_value='')
这种方式会把unique_teams作为一个单独的列组放在透视表中,同样能满足你的需求。
这两种方法里,nunique()都能正常处理team列的字符串值,你之前可能是没找对使用的场景~
备注:内容来源于stack exchange,提问作者Tom Hughes
相关产品推荐
相关产品推荐

