【发布时间】:2018-01-07 19:08:39
【问题描述】:
请看下面的代码。 为什么 df2 和 df3 不同? 根据https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html
left:仅使用左帧中的键,类似于 SQL 左外连接; 保留键顺序
right:仅使用右帧中的键,类似于 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
【问题讨论】:
-
你有什么问题?它工作正常。在 df3 中,您正在应用 B、A(左)连接。它保留列顺序。我没明白你的问题。
-
df3 保留左侧数据框的键顺序,即 B 的 foo1,2,3,4。但是 df2 并没有保留正确的数据帧的键顺序,它仍然是 B 的 foo1,2,3,4,而是 df2 是 foo1,2,4,3。这就是我的意思。