我有两个数据帧,每个数据帧都有一个多重索引。 我想将它们外部合并到它们的公共索引上。 这样做最终会导致非通用索引消失。 我该如何避免这种情况?
设置:
import pandas as pd
tuples1 = [(1,'a'), (1, 'b'), (2, 'a'), (2, 'b')]
df1 = pd.DataFrame(data={'x':[1,2,3,4]}, index=pd.MultiIndex.from_tuples(tuples1,names=['number', 'letter']))
tuples2 = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')]
df2 = pd.DataFrame(data={'y':[10,20,30,40]}, index=pd.MultiIndex.from_tuples(tuples2,names=['number', 'color']))
这会创建两个数据框:
x
number letter
1 a 1
b 2
2 a 3
b 4
y
number color
1 red 10
blue 20
2 red 30
blue 40
这是我将它们外部合并的代码
number
:
merged = df1.merge(df2, on=['number'], how='outer')
这就是我得到的:
x y
number
1 1 10
1 1 20
1 2 10
1 2 20
2 3 30
2 3 40
2 4 30
2 4 40
这就是我想要的:
x y
number letter color
1 a red 1 10
blue 1 20
b red 2 10
blue 2 20
2 a red 3 30
blue 3 40
b red 4 30
blue 4 40
我查看了很多其他 StackOverflow 帖子,但没有成功找到相关答案。
这样做很简单:
import pandas as pd
tuples1 = [(1, 'a'), (1, 'b'), (2, 'a'), (2, 'b')]
df1 = pd.DataFrame(data={'x': [1, 2, 3, 4]}, index=pd.MultiIndex.from_tuples(tuples1, names=['number', 'letter']))
tuples2 = [(1, 'red'), (1, 'blue'), (2, 'red'), (2, 'blue')]
df2 = pd.DataFrame(data={'y': [10, 20, 30, 40]}, index=pd.MultiIndex.from_tuples(tuples2, names=['number', 'color']))
df1_reset = df1.reset_index()
df2_reset = df2.reset_index()
merged = df1_reset.merge(df2_reset, on='number', how='outer')
merged = merged.set_index(['number', 'letter', 'color'])
print(merged)
这给出了
x y
number letter color
1 a red 1 10
blue 1 20
b red 2 10
blue 2 20
2 a red 3 30
blue 3 40
b red 4 30
blue 4 40
因此,您需要重置原始数据帧的索引,执行合并,然后重新应用 MultiIndex。