如何在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:
| id | cat | status | status_1_for_cat_count | status_2_for_category_count |
|---|---|---|---|---|
| 1 | A | 1 | 4 | 1 |
| 2 | A | 1 | 4 | 1 |
| 3 | A | 1 | 4 | 1 |
| 4 | A | 1 | 4 | 1 |
| 5 | A | 2 | 4 | 1 |
| 6 | B | 1 | 1 | 0 |
为什么之前的尝试可能没成功?
你提到用了groupby结合unique_counts、apply等方法没成功,大概率是因为这些方法返回的是分组后的聚合结果(长度和分组数一致),没有和原DataFrame的每一行对应上。而transform会自动把聚合结果广播到原分组的每一行,merge则是显式把统计结果关联回去,这两种方法都能解决多状态+类别统计的匹配问题。
内容的提问来源于stack exchange,提问作者Mathijs de Jong
相关产品推荐
相关产品推荐

