首页 > 解决方案 > 合并多索引 Pandas 数据框

问题描述

我有三个多索引 Pandas 数据框 -

df1 = {('parity', np.nan): {('20194', 1990): 0.3333333333333333,
                            ('22204', 1990): 0.0,
                            ('24060', 1990): 0.3333333333333333},
       ('parity', 0.0): {('20194', 1990): 0.0,
                         ('22204', 1990): 0.0,
                         ('24060', 1990): 0.3333333333333333},
       ('parity', 1.0): {('20194', 1990): 0.3333333333333333,
                         ('22204', 1990): 1.0,
                         ('24060', 1990): 0.0},
       ('parity', 2.0): {('20194', 1990): 0.3333333333333333,
                         ('22204', 1990): 0.0,
                         ('24060', 1990): 0.3333333333333333},
       ('education', 0.0): {('20194', 1990): 0.3333333333333333,
                            ('22204', 1990): 0.6666666666666666,
                            ('24060', 1990): 0.6666666666666666},
       ('education', 1.0): {('20194', 1990): 0.6666666666666666,
                            ('22204', 1990): 0.3333333333333333,
                            ('24060', 1990): 0.3333333333333333}}
df1 = pd.DataFrame(data = df1)

在此处输入图像描述

df2 = {('parity', 'zip'): {0: '20194', 1: '22204', 2: '24060'},
       ('parity', 'year'): {0: 1990, 1: 1990, 2: 1990},
       ('parity', 'parity'): {0: 1.5, 1: 1.0, 2: 1.0}}
df2 = pd.DataFrame(data = df2)

在此处输入图像描述

df3 = {'parity': {('20194', 1990): 1.5, ('22204', 1990): 1.0, ('24060', 1990): 1.0},
       'education': {('20194', 1990): 0.6666666666666666,
                     ('22204', 1990): 0.3333333333333333,
                     ('24060', 1990): 0.3333333333333333}}
df3 = pd.DataFrame(data = df3)

在此处输入图像描述

如何合并zipyear索引和列上的所有数据框,使它们看起来像下图? 在此处输入图像描述

标签: pythonpandas

解决方案


concatMultiIndex级别zipyear索引以及列中的 2 个级别一起使用MultiIndex

#convert columns to MultiIndex in index
df2 = df2.set_index([('parity','zip'),('parity','year')])
#created new MultiIndex in columns
df3.columns = pd.MultiIndex.from_product([df3.columns, ['new']])
df = pd.concat([df1, df2, df3],axis=1).rename_axis(['zip','year'])
print (df)
              parity                               education           parity  \
                 NaN       0.0       1.0       2.0       0.0       1.0 parity   
zip   year                                                                      
20194 1990  0.333333  0.000000  0.333333  0.333333  0.333333  0.666667    1.5   
22204 1990  0.000000  0.000000  1.000000  0.000000  0.666667  0.333333    1.0   
24060 1990  0.333333  0.333333  0.000000  0.333333  0.666667  0.333333    1.0   

                education  
            new       new  
zip   year                 
20194 1990  1.5  0.666667  
22204 1990  1.0  0.333333  
24060 1990  1.0  0.333333  

推荐阅读