2013-06-08 21 views
5

Mam wiele ramek danych z cenami akcji, które chcę dopasować do pojedynczej ramki danych, która zawiera tylko ceny zamknięcia wszystkich zasobów.Scalanie wielu niepowiązanych ramek danych w jedną pandę danych-ramka

Oczekuję, że wszystkie daty ze wszystkich ramek danych będą obecne w kolumnie (indeksie) i "NA" w przypadku, gdy w tym dniu nie było ceny zamknięcia dla akcji.

Przykład z dwóch danych ramek (DF1 i 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 

Teraz mogę zrobić

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

a wynik jest zgodnie z oczekiwaniami:

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 

Jak Muszę zmienić kod, aby zrobić to samo dla dynamicznej liczby ramek danych? W tej chwili mam 8 ramek danych, które muszę wyrównać w ten sposób. Czy istnieje sposób przechwycenia listy ramek danych i wyrównania ich tak jak powyżej - zamiast ręcznego wiązania nazw ramek danych (coś w stylu df [0] do df [7] mówiąc w przenośni)?

Z góry dziękuję i życzę! Dirk

Odpowiedz

4

Jeśli masz dane ramek na liście (rzeczywiste obiekty danych ramki, to znaczy, nie ich nazwy), który wygląda mniej więcej tak:

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

następnie następujący kod powinien zrobić co wydaje szukasz:

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 

można to zrobić bardziej zwarty ze zrozumieniem dict, ale w przykładzie kodu wolę pisowni rzeczy bardziej wyraźnie w celu ułatwienia zrozumienia. Dla porównania, zrozumienie dyktowania wyglądałoby mniej więcej tak:

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

Bardzo fajne, wielkie dzięki! Na tym przykładzie jestem w połowie drogi. Jak mogę sprawić, aby "dflist" był dynamiczny? Nie będę wiedział z góry, ile ramek danych będę potrzebował - więc domyślam się, że szukam sposobu na dynamiczne utworzenie pewnej liczby ramek danych, a następnie użycie twojego kodu. Dziękuję bardzo za Twoją pomoc! – user1653205

+0

Wystarczy użyć standardowych metod manipulacji listą, takich jak 'append()' - więc na przykład, gdy otrzymasz nową ramkę danych, zrób coś w stylu 'dflist.append (new_df)'. – rmunn

+0

Myślę, że jestem coraz bliżej. Załadowałem teraz ramkę danych do dyktafonu, w którym kluczem jest znacznik zasobu, a wartością jest ramka danych z cytatami OHLC dla zasobu. Teraz mam dykta z 8 parami klucz/wartość. Pozostaje pytanie: Jak dołączyć do ramek danych w jeden przez iterowanie przez mój dyktat? – user1653205

Powiązane problemy