Python 将多个数据帧合并为多索引列的数据帧

Python 将多个数据帧合并为多索引列的数据帧,python,python-3.x,pandas,dataframe,multi-index,Python,Python 3.x,Pandas,Dataframe,Multi Index,假设我有3个数据帧 df_1代表收入 Year TSLA MSFT AVY 2019 851 200 112.8 2018 725 150 92.6 df_2代表一些其他收入 Year TSLA MSFT AVY 2019 10 13 17 2018 11 14 18 和df_3代表费用 Year

假设我有3个数据帧

df_1
代表收入

Year        TSLA    MSFT     AVY
2019         851     200   112.8
2018         725     150    92.6
df_2
代表一些其他收入

Year        TSLA    MSFT     AVY
2019          10      13      17
2018          11      14      18
df_3
代表费用

Year        TSLA    MSFT     AVY
2019         110     213     317
2018         111     214     418
获取以下df的代码可能是什么

       TSLA                             MSFT                             AVY
Year   revenues other_revenues expenses revenues other_revenues expenses revenues other_revenues expenses
2019        851             10      110      200             13      213    112.8             17      317
2018        725             11      111      150             14      214     92.6             18      418
列在何处为多索引形式

感谢您与和一起使用多索引进行排序

#if not Year is index first create it
L = [x.set_index('Year') for x in [df_1, df_2, df_3]]
df = (pd.concat(L, 
               axis=1, 
               keys=('evenues', 'other_revenues', 'expenses'))
        .swaplevel(1, 0, axis=1)
        .sort_index(axis=1))
print (df)
         AVY                            MSFT                            TSLA  \
     evenues expenses other_revenues evenues expenses other_revenues evenues   
Year                                                                           
2019   112.8      317             17     200      213             13     851   
2018    92.6      418             18     150      214             14     725   

                              
     expenses other_revenues  
Year                          
2019      110             10  
2018      111             11  
sub = ['revenues', 'other_revenues', 'expenses']
L = [x.set_index('Year') for x in [df_1, df_2, df_3]]
df = (pd.concat(L, 
               axis=1, 
               keys=sub)
        .swaplevel(1, 0, axis=1))

mux = pd.MultiIndex.from_product([df.columns.levels[0], sub])
df = df.reindex(mux, axis=1)
        
print (df)
         TSLA                             MSFT                          \
     revenues other_revenues expenses revenues other_revenues expenses   
Year                                                                     
2019      851             10      110      200             13      213   
2018      725             11      111      150             14      214   

          AVY                          
     revenues other_revenues expenses  
Year                                   
2019    112.8             17      317  
2018     92.6             18      418  
编辑:对于原始添加方式中的订单,从多索引第一级的唯一值开始:

#if not Year is index first create it
L = [x.set_index('Year') for x in [df_1, df_2, df_3]]
df = (pd.concat(L, 
               axis=1, 
               keys=('evenues', 'other_revenues', 'expenses'))
        .swaplevel(1, 0, axis=1)
        .sort_index(axis=1))
print (df)
         AVY                            MSFT                            TSLA  \
     evenues expenses other_revenues evenues expenses other_revenues evenues   
Year                                                                           
2019   112.8      317             17     200      213             13     851   
2018    92.6      418             18     150      214             14     725   

                              
     expenses other_revenues  
Year                          
2019      110             10  
2018      111             11  
sub = ['revenues', 'other_revenues', 'expenses']
L = [x.set_index('Year') for x in [df_1, df_2, df_3]]
df = (pd.concat(L, 
               axis=1, 
               keys=sub)
        .swaplevel(1, 0, axis=1))

mux = pd.MultiIndex.from_product([df.columns.levels[0], sub])
df = df.reindex(mux, axis=1)
        
print (df)
         TSLA                             MSFT                          \
     revenues other_revenues expenses revenues other_revenues expenses   
Year                                                                     
2019      851             10      110      200             13      213   
2018      725             11      111      150             14      214   

          AVY                          
     revenues other_revenues expenses  
Year                                   
2019    112.8             17      317  
2018     92.6             18      418  

键后的swaplevel和sort index是否有错误?@finmathstudent-ya,它缺少一个
,很抱歉。如果我想指定内部级别列索引的顺序(“收入”、“其他收入”、“费用”),代码会是什么?而不是你选择的那种?@finmathstudent-给我一点时间。