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

如何在Pandas透视表的索引中统计唯一值并保留原有聚合结果?

如何在Pandas透视表的索引中统计唯一值并保留原有聚合结果?

嘿,我明白你的需求啦——既要保留原来按球员+球队分组、按比赛汇总得分的透视表,又要额外统计每个球员总共效力过多少支不同的球队,对吧?其实你之前提到的nunique()完全可以处理字符串类型的,只是需要换个方式来用~

我给你两种可行的方案,你可以根据自己的习惯选:

方案一:先做透视表,再合并球队统计数

  1. 先单独计算每个球员的唯一球队数量:
# 按player分组,统计每个player对应的team唯一值数量,并重命名列名
team_count = df.groupby('player')['team'].nunique().rename('unique_teams')
  1. 生成你原本需要的透视表:
pivot = pd.pivot_table(df, index=['player', 'team'], columns='game', values='score', aggfunc='sum', fill_value='')
  1. 将球队统计数合并到透视表中:
# 利用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 07:04:39