Конкатенация столбцов 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
без успеха.
Ответы
Ответ 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
. Я использую его здесь только как удобство.