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

Zer*_*ero 46 python multi-index pandas

给出一个数据帧字典,如:

dict = {'ABC': df1, 'XYZ' : df2}   # of any length...
Run Code Online (Sandbox Code Playgroud)

其中每个数据框具有相同的列和相似的索引,例如:

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
Run Code Online (Sandbox Code Playgroud)

将所有数据帧合并为一个的最简单方法是什么,使用多索引,如:

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  ...
Run Code Online (Sandbox Code Playgroud)

我已经尝试了一些方法 - 例如,对于每个数据帧,用多索引替换列.from_product(['ABC', columns])然后连接axis=1,但没有成功.

Kar*_* D. 66

你可以这样做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
Run Code Online (Sandbox Code Playgroud)

真的concat想要列表,所以以下是等价的:

print(pd.concat([df1, df2], axis=1, keys=['ABC', 'XYZ']))
Run Code Online (Sandbox Code Playgroud)

  • [在最近的问题中讨论](/sf/ask/3302064461/),使用`d.values`和`d.应该避免使用这种方式,因为不能保证订单能够得到维护.考虑`keys,values = zip(*d.items())` (5认同)
  • 我认为顺序是任意但一致的?那不是真的吗?只要它在调用中保持一致,就可以用于这个用例。 (2认同)

gri*_*tis 6

pandas.concat现在自动执行此操作:

import pandas as pd

index = ["row1", "row2"]
df_a = pd.DataFrame({"foo": range(0, 2), "bar": range(2, 4)}, index)
df_b = pd.DataFrame({"foo": range(4, 6), "bar": range(6, 8)}, index)

pd.concat({"A": df_a, "B": df_b}, axis=1)  # axis="columns" also works
Run Code Online (Sandbox Code Playgroud)
       A       B    
     foo bar foo bar
row1   0   2   4   6
row2   1   3   5   7
Run Code Online (Sandbox Code Playgroud)