我有一个包含两列“A”和“B”的 DataFrame。
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)
但是,这对我来说似乎效率极低。有更好的解决办法吗?
最佳答案
您可以使用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 .
关于python - 获取一组中多个分组的 pandas.DataFrame 聚合中每个子组的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344087/