在新的多索引级别下连接Pandas列

时间:2014-05-12 03:23:04

标签: python pandas multi-index

给出一个数据框架字典,如:

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连接,但没有成功。

2 个答案:

答案 0 :(得分:61)

您可以使用concatkeys参数将创建分层列索引):

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语法。我在这里使用它只是为了方便。