如何在Pandas中按id和group分组统计Cat的出现次数?
解决Pandas按多列分组统计指定值出现次数的问题
我来帮你搞定这个Pandas分组统计的问题!先明确下你的场景和需求:
现有如下DataFrame:
import pandas as pd df = pd.DataFrame([ ('A', 'A', 'Cat'), ('A', 'A', 'Dog'), ('A', 'A', 'Cat'), ('A', 'B', 'Dog'), ('B', 'B', 'Rat'), ('B', 'C', 'Cat'), ('B', 'C', 'Cat') ], columns=['id', 'group', 'Animal'])需求:按
id和group分组,统计每组中Cat的出现次数,期望输出为[2, 0, 0, 2](对应AA组2只Cat、AB组0只、BB组0只、BC组2只)
这里给你两种简单高效的实现方法:
方法一:简洁直接的单目标统计法
这种方法专门针对Cat做统计,代码短且高效:
# 按id和group分组,统计每组中Cat的数量 cat_counts = df.groupby(['id', 'group'])['Animal'].apply(lambda x: (x == 'Cat').sum()).tolist() print(cat_counts) # 输出: [2, 0, 0, 2]
逻辑解释:
groupby(['id', 'group']):把id和group组合相同的行归为一组,比如所有id=A且group=A的行是一组apply(lambda x: (x == 'Cat').sum()):对每个组的Animal列做判断——把等于'Cat'的元素标记为True(等价于1),否则为False(等价于0),再用sum()统计总数量.tolist():把最终的统计结果转成你需要的列表格式
方法二:支持多动物统计的通用法
如果你之后需要同时统计其他动物的数量,这种方法会更灵活:
# 分组后统计所有动物的出现次数,缺失的动物用0填充 grouped_animal_counts = df.groupby(['id', 'group'])['Animal'].value_counts().unstack(fill_value=0) # 提取Cat列的结果转为列表 cat_counts = grouped_animal_counts['Cat'].tolist() print(cat_counts) # 输出: [2, 0, 0, 2]
逻辑解释:
value_counts():统计每个组内各动物的出现次数,比如AA组会得到Cat:2, Dog:1unstack(fill_value=0):把动物名称从行索引转成列,没有出现过的动物用0填充,这样每个组都会有Cat的计数(哪怕是0)- 除了提取
Cat列,你还可以直接查看grouped_animal_counts,获取所有动物的分组统计结果
内容的提问来源于stack exchange,提问作者user9617403
相关产品推荐
相关产品推荐

