如何在Pandas中按列分组并统计每组内各值的出现次数
Pandas按指定列分组后统计每组内各值的出现次数
我想在Pandas里用groupby按指定列分组,统计每组中各个值的出现次数。示例数据如下:
d = {'Period': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], 'Result': ['True','True','False','True','False','True','False','True','True','False','False','True','False','True','False','False']} df = pd.DataFrame(data=d) df.sort_values(by=['Period'], inplace=True) print(df)
期望输出是每个Period分组中'True'和'False'的出现次数,格式如下:
Period 1 : 2 True, 2 False 2 : 2 True, 1 False 3 : 0 True, 4 False 4 : 3 True, 1 False
但我试了几种方法都达不到需求:
count()仅统计每组的总条目数;nunique()返回每组的唯一值数量;unique()返回每组的唯一值但不统计次数。
完整测试代码如下:
# 创建DataFrame d = {'Period': [1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4], 'Result': ['True','True','False','True','False','True','False','True','True','False','False','True','False','True','False','False']} df = pd.DataFrame(data=d) df.sort_values(by=['Period'], inplace=True) print(df) # 分组并打印统计结果 print(df.groupby('Period')['Result'].count()) print(df.groupby('Period')['Result'].nunique()) print(df.groupby('Period')['Result'].unique())
解决方法
你需要用groupby结合value_counts()来统计每组内各值的出现次数,再通过unstack()将结果整理为列格式,最后填充缺失值(避免分组中不存在某个值时不显示统计数),再格式化输出。
方法1:value_counts + unstack
# 分组统计各值出现次数,转为列格式并填充缺失值为0 counts = df.groupby('Period')['Result'].value_counts().unstack(fill_value=0) # 按期望格式输出 print("Period") for period, row in counts.iterrows(): print(f"{period} : {row['True']} True, {row['False']} False")
方法2:使用pd.crosstab
也可以直接用交叉表crosstab生成统计结果,写法更简洁:
counts = pd.crosstab(df['Period'], df['Result']) # 按期望格式输出 print("Period") for period, row in counts.iterrows(): print(f"{period} : {row['True']} True, {row['False']} False")
以上两种方法都能输出你需要的结果,其中fill_value=0(方法1)或crosstab默认的0值,确保即使分组中没有某个值(比如Period3中没有'True'),也会显示0次。
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

