2017-10-04 48 views
1

,我有以下数据:GROUPBY和金额与大熊猫的某些列,而包括其他列也

import pandas as pd 
x4 = pd.DataFrame({"ID": [101,101, 102, 103, 104, 105], 
        "Prob": [1, 1,1, 1, 1, 1], 
        "Ef": [0,2, 0, 0, 0.25, 0.29], 
        "W": [2, 2,3, 4, 5, 6], 
        "EC": [0, 0,0, 0, 1.6, 2], 
        "Rand": [11, 12,12, 13, 14, 15]}) 

我想获得sum(Prob * Ef)by ID,然后只保留列ID,列同sumEC列和W列。

所以在最后我想有这样的:

  ID sum_column EC  W 
1:   101 2.00  0.0  2 
2:   101 2.00  0.0  2 
3:   102 0.00  0.0  3 
4:   103 0.00  0.0  4 
5:   104 0.25  1.6  5 
6:   105 0.29  2.0  6 

我已经试过这样:x4.loc[:, ['EC','W','ID','Prob','Ef']].groupby('ID').sum(Prob*Ef)

不过,这并不乘以列工作

回答

2

使用GroupBy.transform

x4['sum_column'] = x4['Prob'].mul(x4['Ef']).groupby(x4['ID']).transform('sum') 
x4 = x4.drop(['Ef','Prob', 'Rand'], axis=1) 
print (x4) 
    ID W EC sum_column 
0 101 2 0.0  2.00 
1 101 2 0.0  2.00 
2 102 3 0.0  0.00 
3 103 4 0.0  0.00 
4 104 5 1.6  0.25 
5 105 6 2.0  0.29 

如果列的顺序很重要, insert

x4.insert(1, 'sum_column', x4['Prob'].mul(x4['Ef']).groupby(x4['ID']).transform('sum')) 
x4 = x4.drop(['Ef','Prob', 'Rand'], axis=1) 
print (x4) 
    ID sum_column W EC 
0 101  2.00 2 0.0 
1 101  2.00 2 0.0 
2 102  0.00 3 0.0 
3 103  0.00 4 0.0 
4 104  0.25 5 1.6 
5 105  0.29 6 2.0 
+0

它的工作原理。对于我的信息,如果不是'sum(Prob * Ef)',我想要'sum(Prob/Ef)'或'sum(Prob-Ef)'或'sum(Prob + Ef)',那么像mult '那样做? – quant

+1

是的,使用'div','sub','add'。 – jezrael