按条件分组并计算子组的总和

时间:2017-09-12 13:31:41

标签: python pandas dataframe group-by pandas-groupby

这是我的数据:

import numpy as np 
import pandas as pd
z = pd.DataFrame({'a':[1,1,1,2,2,3,3],'b':[3,4,5,6,7,8,9], 'c':[10,11,12,13,14,15,16]})
z

    a   b   c
0   1   3   10
1   1   4   11
2   1   5   12
3   2   6   13
4   2   7   14
5   3   8   15
6   3   9   16

问题:

如何对每个子组的不同元素进行计算?例如,对于每个组,我想提取列中的任何元素' c'列中的相应元素' b'在4到9之间,总结它们。

这是我写的代码:(它运行但我无法得到正确的结果)

gbz = z.groupby('a')
# For displaying the groups:
gbz.apply(lambda x: print(x))


list = []

def f(x):
    list_new = []
    for row in range(0,len(x)):
        if (x.iloc[row,0] > 4 and x.iloc[row,0] < 9):
            list_new.append(x.iloc[row,1])
    list.append(sum(list_new))

results = gbz.apply(f)

输出结果应该是这样的:

    a   c
0   1   12
1   2   27
2   3   15

4 个答案:

答案 0 :(得分:3)

最简单的方法是更改​​操作顺序,并首先根据您的条件进行过滤 - 它不会在groupby之后发生变化。

z.query('4 < b < 9').groupby('a', as_index=False).c.sum()

产生

   a   c
0  1  12
1  2  27
2  3  15

答案 1 :(得分:2)

使用

In [2379]: z[z.b.between(4, 9, inclusive=False)].groupby('a', as_index=False).c.sum()
Out[2379]:
   a   c
0  1  12
1  2  27
2  3  15

或者

In [2384]: z[(4 < z.b) & (z.b < 9)].groupby('a', as_index=False).c.sum()
Out[2384]:
   a   c
0  1  12
1  2  27
2  3  15

答案 2 :(得分:1)

您还可以先groupby

z = z.groupby('a').apply(lambda x: x.loc[x['b']\
           .between(4, 9, inclusive=False), 'c'].sum()).reset_index(name='c')
z

   a   c
0  1  12
1  2  27
2  3  15

答案 3 :(得分:1)

或者您可以使用

z.groupby('a').apply(lambda x : sum(x.loc[(x['b']>4)&(x['b']<9),'c']))\
             .reset_index(name='c')
Out[775]: 
   a   c
0  1  12
1  2  27
2  3  15