2013-06-08 12 views
5

Ich habe mehrere Datenrahmen mit Aktienkursen, die ich in einem einzigen Datenrahmen ausrichten möchte, der nur die Schlusskurse für alle Aktien enthält.Mehrere, nicht ausgerichtete Datenrahmen in einzelne Pandas-Datenrahmen zusammenfügen

Ich würde erwarten, dass alle Daten aus allen Datenrahmen in der Datumsspalte (Index) und "NA" vorhanden sind, falls es an diesem Datum keinen Schlusskurs für eine Aktie gab.

Beispiel mit zwei Datenrahmen (DF1 und DF2):

In [5]: df1 
Out[5]: 
      Open High Low Close 
Date1 
2012-01-05 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-03 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

In [7]: df2 
Out[7]: 
      Open High Low Close 
Date1 
2012-01-07 23.00 21.66 25.11 21.04 
2012-01-06 22.00 22.66 23.11 24.04 
2012-01-04 24.04 23.80 23.08 22.16 
2012-01-02 22.16 21.27 20.42 21.24 
2012-01-01 21.24 22.30 22.52 22.30 

Jetzt kann ich

In [8]: frame=pd.DataFrame({"df1.Close":df1["Close"], "df2.Close":df2["Close"]}) 

und das Ergebnis zu tun ist, wie erwartet:

In [9]: frame 
Out[9]: 
      df1.Close df2.Close 
Date1 
2012-01-01  22.30  22.30 
2012-01-02  NaN  21.24 
2012-01-03  21.24  NaN 
2012-01-04  22.16  22.16 
2012-01-05  24.04  NaN 
2012-01-06  NaN  24.04 
2012-01-07  NaN  21.04 

Wie würden Ich muss meinen Code ändern, um das gleiche für eine dynamische Anzahl von Datenrahmen zu tun? Im Moment habe ich 8 Daten-Frames, die ich auf diese Weise ausrichten muss. Gibt es eine Möglichkeit, eine Liste von Datenrahmen zu durchlaufen und sie wie oben ausgerichtet auszurichten - anstatt die Datenrahmennamen (etwas wie df [0] bis df [7] im übertragenen Sinne manuell zu binden)?

Vielen Dank im Voraus und freundliche Grüße! Dirk

Antwort

4

Wenn Sie den Daten-Frames in einer Liste (die eigentlichen Daten-Frame-Objekte, ich meine, ihre Namen nicht), die etwa wie folgt aussehen:

dflist = [df1, df2, df3, df4, df5, df6, df7, df8] 

dann der folgende Code tun soll wie es scheint, die Sie suchen:

frame = {} 
for idx, df in enumerate(dflist): 
    n = idx+1 # Since lists are 0-indexed 
    name = "df{0:d}.Close".format(n) 
    close = df["Close"] 
    frame[name] = close 

Sie könnten mit einem dict Verständnis dies tun kompakt, aber in Beispielcode ziehe ich die Dinge für das Verständnis einfache mehr explizit zu formulieren. Als Referenz würde das Diktat-Verständnis in etwa so aussehen:

{"df{0:d}.Close".format(idx+1): df["Close"] for idx, df in enumerate(dflist)} 
+0

Sehr cool, vielen Dank! Mit diesem Beispiel bin ich auf halbem Weg. Nun, wie würde ich diese "dflist" dynamisch machen? Ich werde nicht im Voraus wissen, wie viele Datenframes ich brauche - also suche ich nach einer Möglichkeit, eine Anzahl von Datenrahmen dynamisch zu erstellen und dann Ihren Code zu verwenden. Vielen Dank für deine Hilfe! – user1653205

+0

Verwenden Sie einfach die üblichen Methoden zur Listenbearbeitung wie 'append()'. Wenn Sie zum Beispiel einen neuen Datenrahmen haben, machen Sie etwas wie 'dflist.append (new_df)'. – rmunn

+0

Ich glaube ich komme näher. Ich habe jetzt die Datenframes in ein Diktat geladen, wo der Schlüssel der Ticker der Aktie ist und der Wert der Datenrahmen mit OHLC-Quotierungen für die Aktie ist. Jetzt habe ich ein Diktat mit 8 Schlüssel/Wert-Paaren. Die verbleibende Frage ist: Wie schließe ich die Datenrahmen zu einem durch die Wiederholung durch mein Diktat? – user1653205

Verwandte Themen