Pandas 将两个DataFrame与两列合并,并与结果中的原始索引保持相同的顺序

Pandas 将两个DataFrame与两列合并,并与结果中的原始索引保持相同的顺序,pandas,Pandas,我有两个数据帧。两个数据帧都有两个键列和一个值列用于合并。我希望在合并结果中保持与原始索引相同的顺序 其他数据框中的键和值可能丢失或更改 数据的顺序很重要。不能按合并结果中的键或值对它们进行排序 应该是这样的: df1_索引/df2_索引/结果仅用于演示 我尝试将合并与外部一起使用: df1=pd.DataFrame({ “键1”:['K','K','A1','A2','B1','B9','C3'], “键2”:['a5','a4','a7','a9','b2','b8','c1'], “

我有两个数据帧。两个数据帧都有两个键列和一个值列用于合并。我希望在合并结果中保持与原始索引相同的顺序

  • 其他数据框中的键和值可能丢失或更改
  • 数据的顺序很重要。不能按合并结果中的键或值对它们进行排序
应该是这样的:

df1_索引
/
df2_索引
/
结果
仅用于演示

我尝试将
合并
外部
一起使用:

df1=pd.DataFrame({
“键1”:['K','K','A1','A2','B1','B9','C3'],
“键2”:['a5','a4','a7','a9','b2','b8','c1'],
“价值1”:[‘苹果’、‘番石榴’、‘猕猴桃’、‘葡萄’、‘香蕉’、‘桃子’、‘浆果’],
})
df2=pd.DataFrame({
“键1”:['K','A1','A3','B1','C2','C3'],
“键2”:['a9','a7','a9','b2','c7','c1'],
“价值2”:[“苹果”、“猕猴桃”、“葡萄”、“香蕉”、“番石榴”、“橙子”],
})
合并(df1,df2,how=“outer”,on=['key1','key2'])
但它只是在行的末尾添加了缺少的键:


如何合并和对齐它们?

构建合并的数据帧时,从每个数据帧获取索引值

merged_df = pd.merge(df1, df2, how="outer", on=['key1', 'key2'])
使用
combine\u first
组合
index\u x
index\u y

merged_df['combined_index'] =merged_df.index_x.combine_first(merged_df.index_y)
使用
combined_index
index_x
删除不需要的列并重置索引进行排序

output = merged_df.sort_values(
    ['combined_index', 'index_x']
).drop(
    ['index_x', 'index_y', 'combined_index'], axis=1
).reset_index(drop=True)
这将产生以下输出:

  key1 key2  Value1  Value2
0    K   a5   apple     NaN
1    K   a9     NaN   apple
2    K   a4   guava     NaN
3   A1   a7    kiwi    kiwi
4   A3   a9     NaN   grape
5   A2   a9   grape     NaN
6   B1   b2  banana  banana
7   C2   c7     NaN   guava
8   B9   b8   peach     NaN
9   C3   c1   berry  orange

你能解释为什么K-a9应该排在K-a4之前吗?。一个来自DF1,另一个来自DF2,我不知道;我不明白你是如何定义他们的order@BingWang无法保证键1/键2中的顺序。它可以是
K-a5
/
K-a4
/
K-a9
。我只关心
df1\u索引
df2\u索引
。太棒了!它起作用了。我是否需要在
df1
df2
中手动构建
index\ux
index\uy
?合并后,有没有方便的方法访问
df1
df2
中的索引?合并前,您必须分别通过执行
df1.reset_index()
df2.reset_index()
来构建和获取索引。