web-dev-qa-db-fra.com

Fusionner deux trames de données avec multi-index

J'ai vu plusieurs articles à ce sujet, mais je n'ai pas pu comprendre comment la fusion, la jointure et la concaturation feraient face à cela. Comment puis-je fusionner deux trames de données pour trouver des index correspondants?

dans:

import pandas as pd
import numpy as np
row_x1 = ['a1','b1','c1']
row_x2 = ['a2','b2','c2']
row_x3 = ['a3','b3','c3']
row_x4 = ['a4','b4','c4']
index_arrays = [np.array(['first', 'first', 'second', 'second']), np.array(['one','two','one','two'])]
df1 = pd.DataFrame([row_x1,row_x2,row_x3,row_x4], columns=list('ABC'), index=index_arrays)
print(df1)

en dehors:

             A   B   C
first  one  a1  b1  c1
       two  a2  b2  c2
second one  a3  b3  c3
       two  a4  b4  c4

dans:

row_y1 = ['d1','e1','f1']
row_y2 = ['d2','e2','f2']
df2 = pd.DataFrame([row_y1,row_y2], columns=list('DEF'), index=['first','second'])
print(df2)

en dehors

         D   E   F
first   d1  e1  f1
second  d2  e2  f2

en d'autres termes, comment puis-je les fusionner pour atteindre df3 (comme suit)?

dans

row_x1 = ['a1','b1','c1']
row_x2 = ['a2','b2','c2']
row_x3 = ['a3','b3','c3']
row_x4 = ['a4','b4','c4']
row_y1 = ['d1','e1','f1']
row_y2 = ['d2','e2','f2']

row_z1 = row_x1 + row_y1
row_z2 = row_x2 + row_y1
row_z3 = row_x3 + row_y2
row_z4 = row_x4 + row_y2

df3 = pd.DataFrame([row_z1,row_z2,row_z3,row_z4], columns=list('ABCDEF'), index=index_arrays)
print(df3)

en dehors

             A   B   C   D   E   F
first  one  a1  b1  c1  d1  e1  f1
       two  a2  b2  c2  d1  e1  f1
second one  a3  b3  c3  d2  e2  f2
       two  a4  b4  c4  d2  e2  f2
10
Andreuccio

Option 1
Utilisation pd.DataFrame.reindex + pd.DataFrame.join
reindex possède un paramètre level pratique qui vous permet de développer les niveaux d'index non présents.

df1.join(df2.reindex(df1.index, level=0))

             A   B   C   D   E   F
first  one  a1  b1  c1  d1  e1  f1
       two  a2  b2  c2  d1  e1  f1
second one  a3  b3  c3  d2  e2  f2
       two  a4  b4  c4  d2  e2  f2

Option 2
Vous pouvez renommer vos axes et join fonctionnera

df1.rename_axis(['a', 'b']).join(df2.rename_axis('a'))

             A   B   C   D   E   F
a      b                          
first  one  a1  b1  c1  d1  e1  f1
       two  a2  b2  c2  d1  e1  f1
second one  a3  b3  c3  d2  e2  f2
       two  a4  b4  c4  d2  e2  f2

Vous pouvez suivre cela avec un autre rename_axis pour obtenir les résultats souhaités

df1.rename_axis(['a', 'b']).join(df2.rename_axis('a')).rename_axis([None, None])

             A   B   C   D   E   F
first  one  a1  b1  c1  d1  e1  f1
       two  a2  b2  c2  d1  e1  f1
second one  a3  b3  c3  d2  e2  f2
       two  a4  b4  c4  d2  e2  f2

12
piRSquared