2017-10-04 2 views
1

Ich habe folgende Daten:groupby und Summe mit Pandas für bestimmte Spalten während einschließlich anderen Spalten auch

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]}) 

Ich mag die sum(Prob * Ef)by ID bekommen würde und dann halten nur die Spalten ID, die Säule mit dem sum, die EC Spalte und die W Spalte.

Also am Ende möchte ich dies haben:

  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 

Ich habe versucht, dieses: x4.loc[:, ['EC','W','ID','Prob','Ef']].groupby('ID').sum(Prob*Ef)

Aber es funktioniert nicht

Antwort

2

Verwenden GroupBy.transform von multiplizierten Spalten:

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 

Wenn Reihenfolge der Spalten wichtig ist, verwenden Sie 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

Es funktioniert. Zu meiner Information, wenn anstelle von 'sum (Prob * Ef)' Ich möchte 'sum (Prob/Ef)' oder 'sum (Prob-Ef)' oder 'sum (Prob + Ef)' gibt es Operatoren wie 'mult 'das tun? – quant

+1

Ja, benutze 'div',' sub', 'add'. – jezrael

Verwandte Themen