我有一个包含两列的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)
然而,这对我来说似乎非常低效。有更好的解决方案吗?
答案 0 :(得分:2)
您可以将unstack
与add_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。