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

如何在Pandas DataFrame中按类别生成不同状态的计数列

在Pandas DataFrame中按类别统计多状态计数的解决方案

嘿,我明白你遇到的问题了——想要给每行添加对应cat分组下status=1和status=2的总次数,之前试了各种方法但没搞定多状态的情况对吧?别担心,这里有两种简洁可靠的方法帮你实现需求:

方法一:用groupby+value_counts+merge

先创建你的原始DataFrame:

import pandas as pd

data = {'id': [1,2,3,4,5,6], 'cat': ['A', 'A', 'A', 'A', 'A', 'B'], 'status': [1, 1, 1, 1, 2, 1]}
df = pd.DataFrame(data)

第一步,按cat分组统计每个status的出现次数,并用unstack把行转成列(空值用0填充):

# 分组统计各status的计数
grouped_counts = df.groupby('cat')['status'].value_counts().unstack(fill_value=0)
# 重命名列名匹配你的需求
grouped_counts = grouped_counts.rename(
    columns={1: 'status_1_for_cat_count', 2: 'status_2_for_category_count'}
)

第二步,把统计结果合并回原DataFrame:

result_df = df.merge(grouped_counts, on='cat', how='left')

方法二:用transform直接生成列(更简洁)

transform方法可以直接返回和原DataFrame长度一致的结果,无需额外合并操作,一步到位:

# 统计每个cat分组下status=1的次数
df['status_1_for_cat_count'] = df.groupby('cat')['status'].transform(lambda x: (x == 1).sum())
# 统计每个cat分组下status=2的次数
df['status_2_for_category_count'] = df.groupby('cat')['status'].transform(lambda x: (x == 2).sum())

最终输出结果

不管用哪种方法,你都会得到符合预期的DataFrame:

idcatstatusstatus_1_for_cat_countstatus_2_for_category_count
1A141
2A141
3A141
4A141
5A241
6B110

为什么之前的尝试可能没成功?

你提到用了groupby结合unique_counts、apply等方法没成功,大概率是因为这些方法返回的是分组后的聚合结果(长度和分组数一致),没有和原DataFrame的每一行对应上。而transform会自动把聚合结果广播到原分组的每一行,merge则是显式把统计结果关联回去,这两种方法都能解决多状态+类别统计的匹配问题。

内容的提问来源于stack exchange,提问作者Mathijs de Jong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:35:01