2013-06-08 5 views
5

У меня есть несколько кадров данных с ценами на акции, которые я хочу выровнять в единый кадр данных, который содержит только тесные цены для всех акций.Слияние нескольких неустановленных кадров данных в один кадр данных pandas

Я бы ожидал, что все даты из всех кадровых фреймов будут присутствовать в столбце даты (индексе) и «NA» в случае отсутствия цены закрытия акций на эту дату.

Пример с двумя данными ТФ (df1 и 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 

Теперь я могу сделать

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

и результат, как и ожидалось:

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 

Как Мне нужно изменить мой код, чтобы сделать то же самое для динамического числа кадров данных? Прямо сейчас у меня есть 8 кадров данных, которые мне нужно согласовать. Есть ли какой-либо способ петли через список кадров данных и выровнять их, как указано выше, вместо того, чтобы вручную связывать имена фреймов данных (что-то вроде df [0] с df [7] образно говоря)?

Заранее благодарен! Dirk

ответ

4

Если у вас есть данные-кадры в списке (фактические объекты данных кадра, я имею в виду, а не их имена), который выглядит примерно так:

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

то следующий код должен делать что это, кажется, что вы ищете:

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 

вы могли бы сделать это более компактно с Dict понимания, но в коде примера я предпочитаю по буквам вещи более ясно для простоты понимания. Для справки, понимание dict будет выглядеть примерно так:

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

Очень круто, спасибо большое! В этом примере я на полпути. Теперь, как я могу сделать динамику dflist? Я не буду знать, сколько кадров данных мне понадобится, поэтому я предполагаю, что я ищу способ создания нескольких кадров данных динамически, а затем использовать ваш код. Большое спасибо за Вашу помощь! – user1653205

+0

Просто используйте стандартные методы обработки списка, такие как 'append()' - так, например, когда вы получаете новый кадр данных, сделайте что-то вроде 'dflist.append (new_df)'. – rmunn

+0

Думаю, я приближаюсь. Я теперь загрузил dataframes в dict, где ключ является тикером акции, а значение - это dataframe с котировками OHLC для акций. Теперь у меня есть dict с 8 парами ключ/значение. Остается вопрос: как подключиться к данным в один, итерации через мой dict? – user1653205

Смежные вопросы