如何在不删除索引的情况下外部合并具有多索引的数据帧?

问题描述 投票:0回答:1

我有两个数据帧,每个数据帧都有一个多重索引。 我想将它们外部合并到它们的公共索引上。 这样做最终会导致非通用索引消失。 我该如何避免这种情况?

设置:

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 帖子,但没有成功找到相关答案。

python pandas dataframe
1个回答
0
投票

这样做很简单:

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。

© www.soinside.com 2019 - 2024. All rights reserved.