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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 15:33:23