Molly M.
Molly M.

Reputation: 63

Merge Multi-Index Pandas Data Frames

I have three multi-index Pandas data frames -

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

How do I merge all the data frames on the zip and year indexes and columns, such that they look like the image below? enter image description here

Upvotes: 2

Views: 73

Answers (1)

jezrael
jezrael

Reputation: 862431

Use concat with MultiIndex with levels zip and year in index and MultiIndex with 2 levels in columns:

#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  

Upvotes: 2

Related Questions