2017-08-31 4 views
-1

Gibt es eine Möglichkeit, mehrere Pandas DataFrames mit einer ähnlichen Syntax wie pd.concat([df1, df2, df3, df4]) zu summieren. Ich verstehe aus der Dokumentation, dass ich df1.sum(df2, fill_value=0) tun kann, aber ich habe eine lange Liste von DataFrames, die ich summieren muss und fragte mich, ob ich es tun könnte, ohne eine Schleife zu schreiben.Summe der Pandas DataFrames

Etwas damit verbundene Frage/Antwort: Pandas sum multiple dataframes (Stack-Überlauf)

Beispiel von dem, was das Ergebnis aussehen soll:

idx1 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'B'), ('b', 'A'), ('b', 'D')]) 
idx2 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'C'), ('b', 'A'), ('b', 'C')]) 
idx3 = pd.MultiIndex.from_tuples([('a', 'A'), ('a', 'D'), ('b', 'A'), ('b', 'C')]) 

np.random.seed([3,1415]) 
df1 = pd.DataFrame(np.random.randn(4, 1), idx1, ['val']) 
df2 = pd.DataFrame(np.random.randn(4, 1), idx2, ['val']) 
df3 = pd.DataFrame(np.random.randn(4, 1), idx3, ['val']) 

df1

enter image description here

df2

enter image description here

df3

enter image description here

Das Ergebnis sollte wie folgt aussehen:

enter image description here

+1

Suchen Sie nur für ein aggregiertes df mit jedem Element summiert, wo die Spalten und Index-Etiketten überein? Oder möchten Sie die Summe für jede Spalte als Summe? Bitte postet das gewünschte Ergebnis – EdChum

+0

Ich entschuldige mich für die Unübersichtlichkeit. Screenshots hinzugefügt, um klarer zu sein. @EdChum – blahblahblah

+0

@ Jezrael's Antwort tut was du willst, ich lösche meins jetzt – EdChum

Antwort

3

Verwenden reduce mitmitParameter fill_value=0:

np.random.seed(12) 

a = pd.DataFrame(np.random.randint(3, size=(5,3)), columns=list('abc')) 
b = pd.DataFrame(np.random.randint(3, size=(5,2)), columns=list('ab')) 
c = pd.DataFrame(np.random.randint(3, size=(5,2)), columns=list('ac')) 
print(a) 
    a b c 
0 2 1 1 
1 2 0 0 
2 2 1 0 
3 1 1 1 
4 2 2 2 

print(b) 
    a b 
0 0 1 
1 0 0 
2 1 2 
3 1 2 
4 0 1 

print(c) 
    a c 
0 2 0 
1 2 2 
2 2 0 
3 0 2 
4 1 1 

from functools import reduce 

dfs = [a,b, c] 
d = reduce(lambda x, y: x.add(y, fill_value=0), dfs) 
print (d) 
    a b c 
0 4 2.0 1.0 
1 4 0.0 2.0 
2 5 3.0 0.0 
3 2 3.0 3.0 
4 3 3.0 3.0 
+1

Das macht was das OP will, nach Klärung +1 – EdChum

+1

@EdChum - Danke. Übrigens, du warst vor einiger Zeit ein großer Lehrer für mich, also vielen Dank für euch alle Antworten;) – jezrael

+1

Danke, ich bin ein bisschen fussiger mit der Beantwortung von Fragen zu SO heutzutage, habe nicht so viel Zeit, aber interessant Fragen wecken immer noch mein Interesse – EdChum

Verwandte Themen