Подтвердить что ты не робот

Конкатенация столбцов Pandas под новым многоиндексным уровнем

С учетом словаря таких фреймов данных, как:

dict = {'ABC': df1, 'XYZ' : df2}   # of any length...

где каждый кадр данных имеет одинаковые столбцы и аналогичный индекс, например:

data           Open     High      Low    Close   Volume
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149

Каков самый простой способ объединить все кадры данных в один, с помощью мультииндекса, например:

symbol         ABC                                       XYZ
data           Open     High      Low    Close   Volume  Open ...
Date                                                   
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  ...
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  ...
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  ...

Я пробовал несколько методов - например, для каждого кадра данных заменить столбцы на мультииндекс, например .from_product(['ABC', columns]), а затем объединиться по axis=1 без успеха.

4b9b3361

Ответ 1

Вы можете сделать это с помощью concat (аргумент keys создаст индекс иерархических столбцов):

d = {'ABC' : df1, 'XYZ' : df2}
print pd.concat(d.values(),axis=1,keys=d.keys())


                XYZ                                          ABC           \
               Open     High      Low    Close   Volume     Open     High   
Date                                                                        
2002-01-17  0.18077  0.18800  0.16993  0.18439  1720833  0.18077  0.18800   
2002-01-18  0.18439  0.21331  0.18077  0.19523  2027866  0.18439  0.21331   
2002-01-21  0.19523  0.20970  0.19162  0.20608   771149  0.19523  0.20970   


                Low    Close   Volume  
Date                                   
2002-01-17  0.16993  0.18439  1720833  
2002-01-18  0.18077  0.19523  2027866  
2002-01-21  0.19162  0.20608   771149

Действительно concat хочет списки, поэтому следующее эквивалентно:

print pd.concat([df1,df2],axis=1,keys=['ABC','XYZ'])

Ответ 2

Добавьте столбец символов к вашим фреймам данных и установите индекс для включения столбца символа, concat и затем снимите этот уровень:

Далее предполагается, что в вашем dict присутствует столько символов, сколько DataFrames, а также что вы проверяете, что порядок символов такой, какой вы хотите, на основе порядка ключей dict:

DF_dict = {'ABC': df1, 'XYZ' : df2} 
dict_keys = DF_dict.keys()
symbols = ['ABC', 'ZXY']

for x in xrange(len(symbols)):
    DF_dict[dict_keys[x]]['symbol'] = symbols[x]
    DF_dict[dict_keys[x]].reset_index(inplace = True)
    DF_dict[dict_keys[x]].set_index(['symbol', 'Date'], inplace = True)

DF = pd.concat(DF_dict[df] for df in dict_keys)
DF = DF.unstack('symbol')

Я думаю, что это был бы подход, который я бы взял. Некоторые люди против синтаксиса inplace. Я использую его здесь только как удобство.