2016-04-29 13 views
1

Sagen wir, ich habe folgende Datenrahmen (aber denken Sie daran, diese mehr als 100 Zeilen und Spalten haben könnte):Summe über Zeilen (aber nicht alle), geben anderen Zeilen Standardwert

table

Ich will nur Summiere die Werte einiger Zeilen, die eine Bedingung erfüllt haben, in diesem Fall der Zeilen, die einen für Stream haben. Für die anderen Zeilen möchte ich, dass sie einen Standardwert erhalten, zum Beispiel .

Dies ist, was ich versuchte:

cols = [col for col in dataFrame.columns if col != 'stream'] 
dataFrame.loc[dataFrame['stream'] == 2, cols].sum(axis=1) 

Aber es das Ergebnis, das ich will nicht bekommen. Was ist falsch an meinem Code?

Antwort

1

Ich glaube, Sie ganz in der Nähe sind, müssen Sie nur neue Spalte sum hinzufügen und dann fillna mit 0:

cols = [col for col in df1.columns if col != 'stream'] 
print cols 
['feat', 'another_feat'] 

df1['sum'] = df1.loc[df1['stream'] == 2, cols ].sum(axis=1) 
df1['sum'] = df1['sum'].fillna(0) 
print df1 
    stream feat another_feat sum 
a  1  8    4 0.0 
b  2  5    5 10.0 
c  2  7    7 14.0 
d  3  3    2 0.0 

Wenn alle Werte int sind, halten Sie float zu int von astype werfen können:

df1['sum'] = df1['sum'].fillna(0).astype(int) 
print df1 
    stream feat another_feat sum 
a  1  8    4 0 
b  2  5    5 10 
c  2  7    7 14 
d  3  3    2 0 

Eine andere Lösung mit numpy.where:

df1['sum'] = np.where(df1['stream'] == 2, df1[cols].sum(axis=1), 0) 
print df1 
    stream feat another_feat sum 
a  1  8    4 0 
b  2  5    5 10 
c  2  7    7 14 
d  3  3    2 0 
+0

Danke wieder Mann, es funktioniert, super Arbeit! Und danke für die Infos zum Casting, werde das wohl später brauchen. – Stanko

+1

Froh kann dir helfen! Schöner Tag! – jezrael

Verwandte Themen