获取在一个组上聚合的多个分组pandas.DateFrame中每个子组的计数

时间:2018-01-19 15:09:59

标签: python pandas

我有一个包含两列的DataFrame" A"和" B"。

   A          B   
0  foo      one 
1  bar      one 
2  foo      two 
3  bar      one
4  foo      two 
5  bar      two 
6  foo      one 
7  foo      one
8  xyz      one

对于" A"中的每个群组,我试图获取" B"的每个值的计数,即B的每个子群,但聚合在分组" A"。

结果应如下所示:

   A          B   countOne  countTwo
0  foo      one          3         2
1  bar      one          2         1
2  foo      two          3         2
3  bar      one          2         1
4  foo      two          3         2
5  bar      two          2         1
6  foo      one          3         2
7  foo      one          3         2
8  xyz      one          1         0

我尝试了几种方法无效,到目前为止我使用这种方法:

A_grouped = df.groupby(['A', 'B'])['A'].count()
A_grouped_ones = A_grouped[:,'one']
A_grouped_twos = A_grouped[:,'two']
df['countOne'] = df['A'].map(lambda a: A_grouped_ones[a] if a in A_grouped_ones else 0)
df['countTwo'] = df['A'].map(lambda a: A_grouped_twos[a] if a in A_grouped_twos else 0)

然而,这对我来说似乎非常低效。有更好的解决方案吗?

1 个答案:

答案 0 :(得分:2)

您可以将unstackadd_prefix一起用于新DataFrame,将join用于原始版本:

df1 = df.groupby(['A', 'B'])['A'].count().unstack(fill_value=0).add_prefix('count_')
print (df1)
B    count_one  count_two
A                        
bar          2          1
foo          3          2
xyz          1          0

df = df.join(df1, on='A')
print (df)
     A    B  count_one  count_two
0  foo  one          3          2
1  bar  one          2          1
2  foo  two          3          2
3  bar  one          2          1
4  foo  two          3          2
5  bar  two          2          1
6  foo  one          3          2
7  foo  one          3          2
8  xyz  one          1          0

另一种选择是使用size

df1 = df.groupby(['A', 'B']).size().unstack(fill_value=0).add_prefix('count_')

差异是size包含NaN个值,count没有 - 检查this answer