尝试对这两个 Pandas 数据帧执行完整的外部连接:
df1 = pd.DataFrame({'a': [1,2,1], 'b': [1,1,2], 'c': [1,2,3]}).set_index(['a', 'b'])
df2 = pd.DataFrame({'a': [1,2,3], 'd': [11,12,13]}).set_index(['a'])
>>> df1
c
a b
1 1 1
2 1 2
1 2 3
>>> df2
d
a
1 11
2 12
3 13
我继续像这样合并这两者:
>>> df1.merge(df2, how='outer', left_index=True, right_index=True)
c d
a b
1 1 1 11
2 1 2 12
1 2 3 11
虽然我希望在此连接中也应该返回不匹配的索引,如下所示:
c d
a b
1 1 1 11
2 1 2 12
3 NaN NaN 13
1 2 4 11
你可以使用一个小技巧 - 按级别b
reset_index
,merge
和最后set_index
b
:
df2 = df1.reset_index(level='b')
.merge(df2, how='outer', left_index=True, right_index=True)
.set_index('b', append=True)
print (df2)
c d
a b
1 1.0 1.0 11
2.0 3.0 11
2 1.0 2.0 12
3 NaN NaN 13
我认为这就是您要找的,因为这不仅仅是一个连接,而是一个多索引连接。
pd.merge(df1.reset_index(), df2.reset_index(),on='a', how='outer').set_index(['a','b'])
c d
a b
1 1.0 1.0 11
2.0 3.0 11
2 1.0 2.0 12
3 NaN NaN 13
它的输出相同,但在这种情况下索引是有序的。