组内的条件计数

时间:2016-05-22 18:53:43

标签: python python-3.x pandas grouping

我想在groupby后进行条件计数;例如,按列A的值进行分组,然后在每个组中计算值5中值B的显示频率。

如果我是针对整个DataFrame执行此操作,那么它只是len(df[df['B']==5])。所以我希望我可以做df.groupby('A')[df['B']==5].size()。但我想布尔索引在GroupBy个对象中不起作用。

示例:

import pandas as pd
df = pd.DataFrame({'A': [0, 4, 0, 4, 4, 6], 'B': [5, 10, 10, 5, 5, 10]})
groups = df.groupby('A')
# some more code
# in the end, I want to get pd.Series({0: 1, 1: 2, 6: 0})

1 个答案:

答案 0 :(得分:5)

选择B等于5的所有行,然后应用groupby/size

In [43]: df.loc[df['B']==5].groupby('A').size()
Out[43]: 
A
0    1
4    2
dtype: int64

或者,您可以将groupby/agg与自定义函数结合使用:

In [44]: df.groupby('A')['B'].agg(lambda ser: (ser==5).sum())
Out[44]: 
A
0    1
4    2
Name: B, dtype: int64

请注意,一般来说,使用自定义函数agg比使用内置方法groupby使用size要慢。所以首先选择第一个选项。

In [45]: %timeit df.groupby('A')['B'].agg(lambda ser: (ser==5).sum())
1000 loops, best of 3: 927 µs per loop

In [46]: %timeit df.loc[df['B']==5].groupby('A').size()
1000 loops, best of 3: 649 µs per loop

要包含大小为零的A值,您可以重新索引结果:

import pandas as pd
df = pd.DataFrame({'A': [0, 4, 0, 4, 4, 6], 'B': [5, 10, 10, 5, 5, 10]})
result = df.loc[df['B'] == 5].groupby('A').size()
result = result.reindex(df['A'].unique())

产量

A
0    1.0
4    2.0
6    NaN
dtype: float64