groupby 中的特定值计数

use*_*403 3 python dataframe pandas 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'])
Run Code Online (Sandbox Code Playgroud)

我把它通过想组idgroup和计算的发生Cat各小组。示例输出将是:

[2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)

2cat人一组AA

0catAB,

0catBB,

2cat人一组BC

任何人都可以帮忙吗?谢谢!

cs9*_*s95 7

你需要mask+ groupby

df['Animal'] = df['Animal'].mask(df['Animal'].ne('Cat'))
df.groupby(['id', 'group'])['Animal'].count().tolist()
Run Code Online (Sandbox Code Playgroud)

[2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)


WeN*_*Ben 5

您可以使用 value_counts

df.groupby(['id','group']).Animal.value_counts().unstack(fill_value=0).loc[:,'Cat'].tolist()
Out[144]: [2, 0, 0, 2]
Run Code Online (Sandbox Code Playgroud)

在最后一步之前返回更多信息 .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
Run Code Online (Sandbox Code Playgroud)


Res*_*awi 5

您的问题与此问题非常相似(如果不重复)。

当您想要执行一些不属于 pandas 的聚合(例如sum,,)时,您应该使用apply 方法maxmin

请注意,这apply 可能会比较慢,所以不要开始到处使用。

现在,对于您的问题,您从分组依据开始:

df.groupby(by=["id", "group"])
Run Code Online (Sandbox Code Playgroud)

Animal然后,从组中选择列:

df.groupby(by=["id", "group"])['Animal']
Run Code Online (Sandbox Code Playgroud)

此时,您已从Animal每个不同组的列中获得了值,可以进行任何聚合。

让我们定义一个函数来计算Catpandas 中的 s Series

def count_cat(series):
    return (series == 'Cat').sum()
Run Code Online (Sandbox Code Playgroud)

您现在要做的就是将此函数传递给该apply方法,如下所示:

df.groupby(by=["id", "group"])['Animal'].apply(count_cat).reset_index(name='count_cat')
Run Code Online (Sandbox Code Playgroud)

结果是:

ID 团体 计数猫
0 A A 2
1 A 0
2 0
3 C 2