给出一个数据框架字典,如:
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
连接,但没有成功。
答案 0 :(得分:61)
您可以使用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']))
答案 1 :(得分: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
语法。我在这里使用它只是为了方便。