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

如何按角色与月份统计DataFrame中唯一Code的数量?

解决Pandas按角色和月份统计唯一Code数量的问题

嘿,我来帮你搞定这个统计需求!你现在需要按每个角色、每个月份统计唯一Code的数量,之前用count()的问题在于它会把重复的Code也算进去,刚好踩中了count()和nunique()的区别点。

先还原你的原始DataFrame:

import pandas as pd

data = {
    'Character': ['Sonic', 'Shadow', 'Sonic', 'Sonic', 'Sonic', 'Sonic', 'Sonic', 'Sonic', 'Sonic', 'Shadow'],
    'Month': ['18-Jan', '18-Jan', '18-Feb', '18-Feb', '18-Mar', '18-Mar', '18-Mar', '18-Mar', '18-Apr', '18-Apr'],
    'Code': ['P008924', 'P007869', 'P007811', 'P008639', 'P008242', 'P007823', 'P007823', 'P008380', 'P008637', 'P008266']
}
sega_df = pd.DataFrame(data)

你的核心需求是:忽略每个角色+月份里重复的Code,只统计唯一值的数量(比如Sonic在3月的唯一Code是3个,而非4个),并且输出成你想要的宽表格式。

问题出在哪?

你之前的代码sega_df.groupby(['Character','Month']).count().unstack()用了count(),这个方法会统计分组内所有非空的条目,哪怕Code重复也会算进去,所以达不到去重统计的效果。

正确的实现方法

这里有两种简洁的方式,都能满足你的需求:

方法1:直接用nunique()统计唯一值(推荐)

这是最直接的方式,Pandas的nunique()方法就是专门用来统计分组内唯一值数量的:

# 按角色和月份分组,统计Code的唯一值数量,转宽表并填充空值为0
sega_pivot = sega_df.groupby(['Character', 'Month'])['Code'].nunique().unstack(fill_value=0)

方法2:先去重再统计

如果你想先手动去掉重复的(角色+月份+Code)组合,再统计数量,也可以这么写:

# 先删除重复的Code条目,再按角色+月份分组统计数量,转宽表并填充空值为0
sega_pivot = sega_df.drop_duplicates(subset=['Character', 'Month', 'Code']).groupby(['Character', 'Month']).size().unstack(fill_value=0)

最终输出结果

两种方法都会得到你期望的格式:

Month       18-Jan  18-Feb  18-Mar  18-Apr
Character                                 
Sonic            1       2       3       1
Shadow           1       0       0       1

内容的提问来源于stack exchange,提问作者florence-y

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:53:26