组内条件计数
Conditional counting within groups
我想在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})
Select 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
我想在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})
Select 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