合并多索引熊猫数据框

时间:2020-02-17 13:02:28

标签: python 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)

enter image description here

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)

enter image description here

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)

enter image description here

如何合并zipyear索引和列上的所有数据框,使其看起来像下面的图像? enter image description here

1 个答案:

答案 0 :(得分:2)

concatMultiIndex一起使用,索引级别为zipyear,将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