python pandas groupby()结果

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)

但我不知道如何"得到"从结果resdf在有序的方式.对此有任何建议会很高兴.谢谢.

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)

  • 我认为你梦寐以求的单行是``df ['D'] = df.groupby(['A','B']).transform(np.size)``.在好的时候和坏的时候,``transform``就在那里.:-D (4认同)

DrT*_*TRD 9

您还可以使用应用于groupby的转换执行一个班轮:

df['D'] = df.groupby(['A','B'])['C'].transform('sum')
Run Code Online (Sandbox Code Playgroud)


and*_*rew 8

您还可以使用合并执行一个班轮,如下所示:

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)