Python groupby中的特定值计数

Python groupby中的特定值计数,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有以下数据帧: 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对其进行分组,并计算各

我有以下数据帧:

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]
2
cat
AA

AB
中的0
cat

BB
中的0
cat

2组
BC


有人能帮忙吗?谢谢

您需要
掩码
+
groupby

df['Animal'] = df['Animal'].mask(df['Animal'].ne('Cat'))
df.groupby(['id', 'group'])['Animal'].count().tolist()


您可以使用
value\u计数

df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0).loc[:,'Cat'].tolist()
Out[144]: [2, 0, 0, 2]
在最后一步之前返回更多信息。loc

df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0)
Out[145]: 
Animal    Cat  Dog  Rat
id group               
A  A        2    1    0
   B        0    1    0
B  B        0    0    1
   C        2    0    0

如果0值不重要,您可以尝试:

list(df[df['Animal']=='Cat'].groupby(['id', 'group']).count()['Animal'])

对不起,我的英语

你的问题与此非常相似(如果不是重复的话)

如果要执行不属于pandas的某些聚合(例如,
sum
max
min
),则应使用

请注意,
apply
可能会慢一些,所以不要到处使用

现在,对于您的问题,您可以从以下分组开始:

df.groupby(by=["id", "group"])
然后,从以下组中选择
Animal
列:

df.groupby(by=["id", "group"])['Animal']
此时,每个不同的组都有
Animal
列中的值,可以进行任何聚合

让我们定义一个函数来计算熊猫
系列中的
Cat
s:

def count_cat(series):
    return (series == 'Cat').sum()
现在需要做的就是将此函数传递给
apply
方法,如下所示:

df.groupby(by=["id", "group"])['Animal'].apply(count_cat).reset_index(name='count_cat')
结果是:

身份证件 组 猫伯爵 0 A. A. 2. 1. A. B 0 2. B B 0 3. B C 2.
注意:
ne
是“不相等”这是否回答了您的问题?
df.groupby(by=["id", "group"])['Animal'].apply(count_cat).reset_index(name='count_cat')