请参阅以下代码。 为什么df2和df3不同? 根据{{3}}
left:仅使用左框架中的键,类似于SQL左外连接; 保留关键顺序
右:仅使用右框中的键,类似于SQL右外连接; 保留关键顺序
我有一种感觉,右合并不会保留关键顺序.. 谢谢!
import pandas as pd
print pd.__version__ # 0.20.3
A = pd.DataFrame({'lkey': ['foo1', 'foo2', 'foo4'], 'value': [1, 2, 4]})
B = pd.DataFrame({'rkey': ['foo1', 'foo2', 'foo3', 'foo4'], 'value': [5, 6, 7, 8]})
# A
# lkey value
# 0 foo1 1
# 1 foo2 2
# 2 foo4 4
#
# B
# rkey value
# 0 foo1 5
# 1 foo2 6
# 2 foo3 7
# 3 foo4 8
print '+++'
df2 = pd.merge(A, B, left_on='lkey', right_on='rkey', how='right', indicator=True)
print df2
# lkey value_x rkey value_y _merge
# 0 foo1 1.0 foo1 5 both
# 1 foo2 2.0 foo2 6 both
# 2 foo4 4.0 foo4 8 both
# 3 NaN NaN foo3 7 right_only
print '+++'
df3 = pd.merge(B, A, left_on='rkey', right_on='lkey', how='left', indicator=True)
print df3
# rkey value_x lkey value_y _merge
# 0 foo1 5 foo1 1.0 both
# 1 foo2 6 foo2 2.0 both
# 2 foo3 7 NaN NaN left_only
# 3 foo4 8 foo4 4.0 both
答案 0 :(得分:0)
似乎正确的合并将首先将键的交集放在合并的数据帧的顶部,然后对其进行排序。然后,右侧数据框的“剩余”键将插入到合并数据框的底部。
使用https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
中的修改示例A = pd.DataFrame({'key1': ['K0', 'K2', 'K0', 'K1'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
B = pd.DataFrame({'key1': ['K0', 'K2', 'K0', 'K0'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
A
key1 A B
0 K0 A0 B0
1 K2 A1 B1
2 K0 A2 B2
3 K1 A3 B3
B
key1 C D
0 K0 C0 D0
1 K2 C1 D1
2 K0 C2 D2
3 K0 C3 D3
进行左连接保留(数据框B的)关键顺序
pd.merge(A, B, how='left', on='key1')
key1 A B C D
0 K0 A0 B0 C0 D0
1 K0 A0 B0 C2 D2
2 K0 A0 B0 C3 D3
3 K2 A1 B1 C1 D1
4 K0 A2 B2 C0 D0
5 K0 A2 B2 C2 D2
6 K0 A2 B2 C3 D3
7 K1 A3 B3 NaN NaN
但是,切换输入数据帧的右联接给出以下内容:
pd.merge(B, A, how='right', on='key1')
key1 C D A B
0 K0 C0 D0 A0 B0
1 K0 C2 D2 A0 B0
2 K0 C3 D3 A0 B0
3 K0 C0 D0 A2 B2
4 K0 C2 D2 A2 B2
5 K0 C3 D3 A2 B2
6 K2 C1 D1 A1 B1
7 K1 NaN NaN A3 B3