我试图做一些我知道必须是基本熊猫的事情,但我正在绞尽脑汁想出来。我希望每个组的比例和计数可用于任意级别的分组:
import pandas as pd
df = pd.DataFrame({'A': [1, 0, 1, 0, 1, 0, 0, 0], 'B': ['A'] * 4 + ['B'] * 4})
gb = df.groupby(['A', 'B']).size()
prop_gb = gb / gb.groupby(level=0).sum()
prop_gb
现在是:
prop_gb
Out[116]:
A B
0 A 0.400000
B 0.600000
1 A 0.666667
B 0.333333
dtype: float64
我最终还是想要这个:
A B prop count
0 A 0.400000 2
B 0.600000 3
1 A 0.666667 2
B 0.333333 1
我尝试合并两个pandas.Series
个对象,gb
和prop_gb
,将它们转换为词典,然后加入"他们那样,但我知道必须有一个本地熊猫的方法来实现这个目标......
这在技术上实现了我想要的目标:
desired = {k: (v, prop_gb.to_dict()[k]) for k, v in gb.to_dict().items()}
desired
{(0, 'A'): (2, 0.40000000000000002),
(0, 'B'): (3, 0.59999999999999998),
(1, 'A'): (2, 0.66666666666666663),
(1, 'B'): (1, 0.33333333333333331)}
答案 0 :(得分:1)
您可以使用ItemId
创建一个数据框,然后添加to_frame
列:
prop
或者,从2系列中创建一个新框架:
>>> desired = df.groupby(['A', 'B']).size().to_frame('count')
>>> desired['prop'] = gb / gb.groupby(level=0).sum()
>>> desired
count prop
A B
0 A 2 0.400000
B 3 0.600000
1 A 2 0.666667
B 1 0.333333
答案 1 :(得分:1)
Concat你创造的两个系列:
df = pd.concat([prop_gb, gb], axis=1)
df.columns = ['prop', 'count']
df
prop count
A B
0 A 0.400000 2
B 0.600000 3
1 A 0.666667 2
B 0.333333 1
答案 2 :(得分:1)
您可以在一个表达式中生成这些值,如下所示:
df.groupby(['A', 'B']).size().agg(
{'count': lambda x: x, 'prop':lambda x: x / x.sum(level=0)}
).unstack(level=0).reset_index()
# A B count prop
# 0 0 A 2.0 0.400000
# 1 0 B 3.0 0.600000
# 2 1 A 2.0 0.666667
# 3 1 B 1.0 0.333333