Gibt es eine Möglichkeit, die Spalten nach der Gruppierung im Pandas-Datenrahmen zu summieren? Ich habe zum Beispiel den folgenden Datenrahmen:
ID W_1 W_2 W_3
1 0.1 0.2 0.3
1 0.2 0.4 0.5
2 0.3 0.3 0.2
2 0.1 0.3 0.4
2 0.2 0.0 0.5
1 0.5 0.3 0.2
1 0.4 0.2 0.1
Ich möchte eine zusätzliche Spalte namens "my_sum" haben, die die erste Zeile in allen Spalten (W_1, W_2, W_3) summiert. Die Ausgabe würde ungefähr so aussehen:
ID W_1 W_2 W_3 my_sum
1 0.1 0.2 0.3 0.6
1 0.2 0.4 0.5 1.1
2 0.3 0.3 0.2 0.8
2 0.1 0.3 0.4 0.8
2 0.2 0.0 0.5 0.7
1 0.5 0.3 0.2 1.0
1 0.4 0.2 0.1 0.7
Ich habe folgendes versucht:
df['my_sum'] = df.groupby('ID')['W_1','W_1','W_1'].transform(sum,axis=1)
dies summiert jedoch alle Einträge von nur W_1. Die Dokumentation erwähnt den Achsenparameter, aber ich bin mir nicht sicher, warum er nicht wirksam ist.
Ich habe mir diese Frage und auch diese angesehen, aber sie unterscheiden sich von dem, was ich will.
Das Gleiche ist die .sum(1)
. Hier sind einige einfallsreiche Alternativen zu den bereits veröffentlichten Antworten.
df.select_dtypes
df['my_sum'] = df.select_dtypes(float).sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
df.iloc
df['my_sum'] = df.iloc[:, 1:].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
Dies nutzt Ihre Daten unangenehm aus.
df['my_sum'] = df[df < 1].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
DataFrame.sum
oder numpy.sum
Filtern Sie nach den Spaltennamen mit str.contains
:
df.iloc[:, df.columns.str.contains('W_')].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
Alternativ können Sie die Leistung eines numpy-Arrays direkt summieren:
df['my_sum'] = df.values[:, 1:].sum(1)
df
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
In [7]: df['my_sum'] = df.drop('ID',1).sum(axis=1)
In [8]: df
Out[8]:
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
oder:
In [9]: df['my_sum'] = df.filter(regex='^W_\d+').sum(axis=1)
In [10]: df
Out[10]:
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
Sie müssen nicht nach etwas gruppieren, wenn Sie nur Zeilen summieren möchten. Verwenden Sie einfach axis=1
in Ihrer Summe.
Der entscheidende Punkt besteht darin, herauszufinden, welche Spalten zu summieren sind. In Ihrem Fall können wir die passenden Spalten auf viele Arten auswählen. Wir wissen nicht, wie Ihre "echten" Daten aussehen.
@MaxU deckte die praktischeren Lösungen ab. Dieser sollte schnell sein.
df.assign(
my_sum=np.column_stack([df[c].values for c in df if c.startswith('W_')]).sum(1)
)
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
Oder wenn es wirklich nur ['W_1', 'W_2', 'W_3']
ist
df.assign(my_sum=df[['W_1', 'W_2', 'W_3']].sum(1))
ID W_1 W_2 W_3 my_sum
0 1 0.1 0.2 0.3 0.6
1 1 0.2 0.4 0.5 1.1
2 2 0.3 0.3 0.2 0.8
3 2 0.1 0.3 0.4 0.8
4 2 0.2 0.0 0.5 0.7
5 1 0.5 0.3 0.2 1.0
6 1 0.4 0.2 0.1 0.7
Sie können auch eine Liste an den Datenrahmen übergeben, die angibt, welche Spalten summiert werden. Dies ist hilfreich, da Spalten leicht in Listenform eingefügt werden können.
sum_list = ['W_1', 'W_2', 'W_3']
df['my_sum'] = df[sum_list].sum(1)