Ich habe einen Datenrahmen, so etwas wie:
foo bar qux
0 a 1 3.14
1 b 3 2.72
2 c 2 1.62
3 d 9 1.41
4 e 3 0.58
und ich möchte am Ende des Datenrahmens eine 'Gesamt'-Zeile hinzufügen:
foo bar qux
0 a 1 3.14
1 b 3 2.72
2 c 2 1.62
3 d 9 1.41
4 e 3 0.58
5 tot 15 9.47
Ich habe versucht, den sum
Befehl zu verwenden, aber am Ende habe ich eine Serie, die zwar wieder in einen Datenrahmen konvertiert werden kann, aber die Datentypen nicht verwaltet:
tot_row = pd.DataFrame(df.sum()).T
tot_row['foo'] = 'tot'
tot_row.dtypes:
foo object
bar object
qux object
Ich möchte die Datentypen aus dem ursprünglichen Datenrahmen beibehalten, da ich andere Operationen auf die gesamte Zeile anwenden muss, wie zum Beispiel:
baz = 2*tot_row['qux'] + 3*tot_row['bar']
df.loc['Total']= df.sum()
, von diesem LinkAntworten:
Fügen Sie eine Summenzeile mit hinzu
df.append(df.sum(numeric_only=True), ignore_index=True)
Die Konvertierung ist nur erforderlich, wenn Sie eine Spalte mit Zeichenfolgen oder Objekten haben.
Es ist eine etwas fragile Lösung, daher würde ich empfehlen, sich an die Vorgänge im Datenrahmen zu halten. z.B.
baz = 2*df['qux'].sum() + 3*df['bar'].sum()
quelle
np.nan
in der gesamten Zeile angezeigt.df.loc["Total"] = df.sum()
funktioniert für mich und ich finde es leichter, mich zu erinnern. Vermisse ich etwas In früheren Versionen war das wahrscheinlich nicht möglich.
Ich möchte die gesamte Zeile jedoch nur vorübergehend hinzufügen. Das dauerhafte Hinzufügen ist gut für die Anzeige, macht es jedoch zu einem Aufwand für weitere Berechnungen.
Gerade gefunden
df.append(df.sum().rename('Total'))
Dies druckt, was ich in einem Jupyter-Notizbuch möchte, und scheint den df selbst unberührt zu lassen.
quelle
Update: 2020
So erhalten Sie sowohl die Zeilen- als auch die Spaltensumme:
import numpy as np import pandas as pd df = pd.DataFrame({'a': [10,20],'b':[100,200],'c': ['a','b']}) df.loc['Column_Total']= df.sum(numeric_only=True, axis=0) df.loc[:,'Row_Total'] = df.sum(numeric_only=True, axis=1) print(df) a b c Row_Total 0 10.0 100.0 a 110.0 1 20.0 200.0 b 220.0 Column_Total 30.0 300.0 NaN 330.0
quelle
Verwendung
DataFrame.pivot_table
mitmargins=True
:import pandas as pd data = [('a',1,3.14),('b',3,2.72),('c',2,1.62),('d',9,1.41),('e',3,.58)] df = pd.DataFrame(data, columns=('foo', 'bar', 'qux'))
Original
df
:foo bar qux 0 a 1 3.14 1 b 3 2.72 2 c 2 1.62 3 d 9 1.41 4 e 3 0.58
Da
pivot_table
eine Gruppierung erforderlich ist (ohne dasindex
ArgumentValueError: No group keys passed!
wird ein a ausgelöst) und Ihr ursprünglicher Index leer ist, verwenden wir die folgendefoo
Spalte:df.pivot_table(index='foo', margins=True, margins_name='total', # defaults to 'All' aggfunc=sum)
Voilà!
bar qux foo a 1 3.14 b 3 2.72 c 2 1.62 d 9 1.41 e 3 0.58 total 18 9.47
quelle
Alternativer Weg (verifiziert auf Pandas 0.18.1):
import numpy as np total = df.apply(np.sum) total['foo'] = 'tot' df.append(pd.DataFrame(total.values, index=total.keys()).T, ignore_index=True)
Ergebnis:
foo bar qux 0 a 1 3.14 1 b 3 2.72 2 c 2 1.62 3 d 9 1.41 4 e 3 0.58 5 tot 18 9.47
quelle
Aufbauend auf der Antwort von JMZ
df.append(df.sum(numeric_only=True), ignore_index=True)
Wenn Sie Ihren aktuellen Index weiterhin verwenden möchten, können Sie die Summenreihe mit .rename () wie folgt benennen:
df.append(df.sum().rename('Total'))
Dadurch wird am Ende der Tabelle eine Zeile hinzugefügt.
quelle
Das Folgende hat mir geholfen, einem Datenrahmen eine Spalten- und eine Zeilensumme hinzuzufügen.
Angenommen, dft1 ist Ihr ursprünglicher Datenrahmen. Fügen Sie nun mit den folgenden Schritten eine Spaltensumme und eine Zeilensumme hinzu.
from io import StringIO import pandas as pd #create dataframe string dfstr = StringIO(u""" a;b;c 1;1;1 2;2;2 3;3;3 4;4;4 5;5;5 """) #create dataframe dft1 from string dft1 = pd.read_csv(dfstr, sep=";") ## add a column total to dft1 dft1['Total'] = dft1.sum(axis=1) ## add a row total to dft1 with the following steps sum_row = dft1.sum(axis=0) #get sum_row first dft1_sum=pd.DataFrame(data=sum_row).T #change it to a dataframe dft1_sum=dft1_sum.reindex(columns=dft1.columns) #line up the col index to dft1 dft1_sum.index = ['row_total'] #change row index to row_total dft1.append(dft1_sum) # append the row to dft1
quelle
Dies ist die Art und Weise, wie ich es mache, indem ich die Zuweisungsmethode in Kombination mit einer Lambda-Funktion transponiere und verwende. Das macht es mir einfach.
df.T.assign(GrandTotal = lambda x: x.sum(axis=1)).T
quelle
Aufbauend auf der Antwort von Matthias Kauer.
So fügen Sie die Zeilensumme hinzu:
df.loc["Row_Total"] = df.sum()
Um die Spaltensumme hinzuzufügen,
df.loc[:,"Column_Total"] = df.sum(axis=1)
quelle