Sim*_*ley 21 python group-by pandas
我有以下python pandas数据框:
df = pd.DataFrame( {
'A': [1,1,1,1,2,2,2,3,3,4,4,4],
'B': [5,5,6,7,5,6,6,7,7,6,7,7],
'C': [1,1,1,1,1,1,1,1,1,1,1,1]
} );
df
A B C
0 1 5 1
1 1 5 1
2 1 6 1
3 1 7 1
4 2 5 1
5 2 6 1
6 2 6 1
7 3 7 1
8 3 7 1
9 4 6 1
10 4 7 1
11 4 7 1
Run Code Online (Sandbox Code Playgroud)
我想有另一个列存储固定(两个)A和B的C值之和的值.即,类似于:
A B C D
0 1 5 1 2
1 1 5 1 2
2 1 6 1 1
3 1 7 1 1
4 2 5 1 1
5 2 6 1 2
6 2 6 1 2
7 3 7 1 2
8 3 7 1 2
9 4 6 1 1
10 4 7 1 2
11 4 7 1 2
Run Code Online (Sandbox Code Playgroud)
我尝试过大熊猫groupby,它有点工作:
res = {}
for a, group_by_A in df.groupby('A'):
group_by_B = group_by_A.groupby('B', as_index = False)
res[a] = group_by_B['C'].sum()
Run Code Online (Sandbox Code Playgroud)
但我不知道如何"得到"从结果res到df在有序的方式.对此有任何建议会很高兴.谢谢.
And*_*den 17
这是一种方式(虽然它感觉这应该适用于一次申请,我无法得到它).
In [11]: g = df.groupby(['A', 'B'])
In [12]: df1 = df.set_index(['A', 'B'])
Run Code Online (Sandbox Code Playgroud)
该sizeGROUPBY功能是你想要的,我们必须把它匹配到"A"和"B"作为索引:
In [13]: df1['D'] = g.size() # unfortunately this doesn't play nice with as_index=False
# Same would work with g['C'].sum()
In [14]: df1.reset_index()
Out[14]:
A B C D
0 1 5 1 2
1 1 5 1 2
2 1 6 1 1
3 1 7 1 1
4 2 5 1 1
5 2 6 1 2
6 2 6 1 2
7 3 7 1 2
8 3 7 1 2
9 4 6 1 1
10 4 7 1 2
11 4 7 1 2
Run Code Online (Sandbox Code Playgroud)
您还可以使用应用于groupby的转换执行一个班轮:
df['D'] = df.groupby(['A','B'])['C'].transform('sum')
Run Code Online (Sandbox Code Playgroud)
您还可以使用合并执行一个班轮,如下所示:
df = df.merge(pd.DataFrame({'D':df.groupby(['A', 'B'])['C'].size()}), left_on=['A', 'B'], right_index=True)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23716 次 |
| 最近记录: |