如何按角色与月份统计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
相关产品推荐
相关产品推荐

