2012-06-19 22 views
29

Ich habe zwei dataframes, beide indexiert von timeseries. Ich muss die Elemente zusammenfügen, um eine neue dataframe zu bilden, aber nur wenn der Index und die Spalte identisch sind. Wenn das Element nicht in einem der dataframe s vorhanden ist, sollte es als eine Null behandelt werden.Hinzufügen von zwei Pandas Datenrahmen

Ich habe versucht mit .add, aber das Summen unabhängig von Index und Spalte. Probieren Sie auch eine einfache combined_data = dataframe1 + dataframe2, aber geben Sie eine NaN, wenn beide Datenfelder nicht das Element haben.

Irgendwelche Vorschläge?

+0

Können Sie erklären, was Sie wollen passieren, wenn ein Element in einem oder beiden Datenrahmen nicht existiert? Sie sagen, wenn das Element nicht in * einem * Datenrahmen existiert, sollte es als Null behandelt werden --- meinst du, der Wert in diesem Datenrahmen sollte als Null behandelt und zu dem Wert aus dem anderen Datenrahmen addiert werden, oder meinst du? Der Wert im Ergebnisdatenfeld sollte Null sein? Du sagst auch 'df1 + df2' funktioniert nicht, weil es NaN gibt, wenn beide das Element nicht haben. Was möchten Sie in diesem Fall tun? Sie wollen eine Null im Ergebnis? – BrenBarn

Antwort

48

Wie wäre es mit x.add(y, fill_value=0)?

import pandas as pd 

df1 = pd.DataFrame([(1,2),(3,4),(5,6)], columns=['a','b']) 
Out: 
    a b 
0 1 2 
1 3 4 
2 5 6 

df2 = pd.DataFrame([(100,200),(300,400),(500,600)], columns=['a','b']) 
Out: 
    a b 
0 100 200 
1 300 400 
2 500 600 

df_add = df1.add(df2, fill_value=0) 
Out: 
    a b 
0 101 202 
1 303 404 
2 505 606 
+0

Perfekt, genau was ich suchte. Vielen Dank – cs0679

7

Wenn ich Sie richtig verstehe, wollen Sie so etwas wie:

(x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 

Dadurch wird die Summe der beiden Datenrahmen geben. Wenn ein Wert in einem Datenrahmen ist und nicht in dem anderen, ist das Ergebnis an dieser Position der vorhandene Wert. Wenn ein Wert in beiden Datenrahmen fehlt, ist das Ergebnis an dieser Position Null.

>>> x 
    A B C 
0 1 2 NaN 
1 3 NaN 4 
>>> y 
    A B C 
0 8 NaN 88 
1 2 NaN 5 
2 10 11 12 
>>> (x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 
    A B C 
0 9 2 88 
1 5 0 9 
2 10 11 12 
+1

Danke, aber ich habe meine Daten nicht sehr gut erklärt, da ich in beiden DataFrames unterschiedliche Spalten habe, z. A, B, C in Datenrahmen1 und A, B, D in Datenrahmen 2. Der Ausgang sollte ein Datenrahmen mit A, B, C, D sein – cs0679

+0

Diese Antwort funktioniert für mich Use-Case. Vielen Dank! – ivrin

0

Weitere allgemeine Antwort zu machen ... ich zuerst den gemeinsamen Index nehme beiden Datenrahmen für die Synchronisierung, dann werde ich jeden von ihnen zu meinem Muster verbinden (Daten) und ich werde die Spalten der Summe die gleichen Namen und kommen schließlich beiden Datenrahmen (hinzugefügt Spalten in einem von ihnen zu löschen),

Sie ein Beispiel sehen kann (mit Googles Aktienkursen von google gemacht) hier:

import numpy as np 
import pandas as pd 
import datetime as dt 

prices = pd.DataFrame([[553.0, 555.5, 549.3, 554.11, 0], 
         [556.8, 556.8, 544.05, 545.92, 545.92], 
         [545.5, 546.89, 540.97, 542.04, 542.04]], 
         index=[dt.datetime(2014,11,04), dt.datetime(2014,11,05), dt.datetime(2014,11,06)], 
         columns=['Open', 'High', 'Low', 'Close', 'Adj Close']) 

corrections = pd.DataFrame([[0, 555.22], [1238900, 0]], 
        index=[dt.datetime(2014,11,3), dt.datetime(2014,11,4)], 
        columns=['Volume', 'Adj Close']) 

dates = pd.DataFrame(prices.index, columns = ['Dates']).append(pd.DataFrame(corrections.index, columns = ['Dates'])).drop_duplicates('Dates').set_index('Dates').sort(axis=0) 
df_corrections = dates.join(corrections).fillna(0) 
df_prices = dates.join(prices).fillna(0) 

for col in prices.columns: 
    if col in corrections.columns: 
     df_prices[col]+=df_corrections[col] 
     del df_corrections[col] 

df_prices = df_prices.join(df_corrections) 
1

Sowohl die oben genannten Antworten - fillna(0) und eine direkte Addition ergeben Nan-Werte, wenn einer von ihnen unterschiedliche Strukturen hat.

Sein besseres fill_value verwenden

df.add(other_df, fill_value=0)

Verwandte Themen