2013-05-16 2 views
7

Ich möchte zwei Datenrahmen in bestimmten Spalten (key1, key2) zusammenführen und die Werte für eine andere Spalte (Wert) zusammenfassen.Merge 2 Datenrahmen in Pandas: Join auf einigen Spalten, summiere andere

>>> df1 = pd.DataFrame({'key1': range(4), 'key2': range(4), 'value': range(4)}) 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  2 
3  3  3  3 

>>> df2 = pd.DataFrame({'key1': range(2, 6), 'key2': range(2, 6), 'noise': range(2, 6), 'value': range(10, 14)}) 
    key1 key2 noise value 
0  2  2  2  10 
1  3  3  3  11 
2  4  4  4  12 
3  5  5  5  13 

Ich möchte dieses Ergebnis:

key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

In SQL Begriffe, ich will:

SELECT df1.key1, df1.key2, df1.value + df2.value AS value 
FROM df1 OUTER JOIN df2 ON key1, key2 

Ich habe versucht, zwei Ansätze:

Ansatz 1

concatenated = pd.concat([df1, df2]) 
grouped = concatenated.groupby(['key1', 'key2'], as_index=False) 
summed = grouped.agg(np.sum) 
result = summed[['key1', 'key2', 'value']] 

Ansatz 2

joined = pd.merge(df1, df2, how='outer', on=['key1', 'key2'], suffixes=['_1', '_2']) 
joined = joined.fillna(0.0) 
joined['value'] = joined['value_1'] + joined['value_2'] 
result = joined[['key1', 'key2', 'value']] 

Beide Ansätze geben das Ergebnis, das ich will, aber ich frage mich, ob es einen einfacheren Weg ist.

Antwort

8

Ich weiß ja nicht, einfacher, aber man kann etwas prägnanter erhalten:

>>> pd.concat([df1, df2]).groupby(["key1", "key2"], as_index=False)["value"].sum() 
    key1 key2 value 
0  0  0  0 
1  1  1  1 
2  2  2  12 
3  3  3  14 
4  4  4  12 
5  5  5  13 

Je nach Toleranz ops für die Verkettung, möchten Sie vielleicht diese auf mehrere Zeilen sowieso brechen, obwohl (vier neigt dazu, nahe an meiner oberen Grenze zu liegen, in diesem Fall concat-groupby-select-sum).

+0

Es scheint * scheint * wie ihre sollte eine knappere Art sein ... wie eine merge-time-Aggregation. –

+0

Ich war auf der Suche nach einer magischen Funktion, die alles optimal macht. – Laurie

+0

Ich wählte den Ansatz 2 und verkettete Operationen so viel wie möglich, weil es auf diese Weise schneller ist. – Laurie

Verwandte Themen