我无法区分为什么要在两个DFs的索引上进行简单的合并而得到不同的行为。基于文档,我期望得到的数据将遵循正确的DF索引。
案例1
staff= pd.DataFrame([1,2,3],index=['Kelly','Sally','James'])
student= pd.DataFrame(['Texas','Califa','South Dakota'],index=['James','Mike','Sally'])
pd.merge(student,staff,left_index=True,right_index=True,how='right')我得到:
0_x 0_y
Kelly NaN 22
Sally South Dakota 38
James Texas 45,它遵循正确的DF (人员)索引。
案例2
left = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]},
index = ["K0", "K1", "K0", "K3"])
right = pd.DataFrame({"C": ["C0", "C1"], "D": ["D0", "D1"]}, index=["K1", "K0"])
pd.merge(left,right,left_index=True,right_index=True,how='right')我得到了
A B C D
K0 A0 B0 C1 D1
K0 A2 B2 C1 D1
K1 A1 B1 C0 D0但是,我还以为:
A B C D
K1 A1 B1 C0 D0
K0 A0 B0 C1 D1
K0 A2 B2 C1 D1如案例1所示
谢谢。
发布于 2021-07-22 01:32:09
问题是索引中的重复值,这需要一些开销来在位置上区分具有相同索引的行。无论merge类型如何,都会发生此过程。注:join也将表现出相同的行为。
要解决这个问题,可以使用reset_index,然后在两个框架上的列"index"上加入,然后在合并的框架上加入set_index,将"index"列返回到DataFrame的索引中。
merged = pd.merge(
left.reset_index(), # Create Index Column on left
right.reset_index(), # Create Index Column on right
on='index', how='right'
).set_index('index').rename_axis(None) # Put index backmerged
A B C D
K1 A1 B1 C0 D0
K0 A0 B0 C1 D1
K0 A2 B2 C1 D1为什么一号案子起作用了?对齐过程中导致“意外”行为的部分是使用位置排序来区分具有相同索引的不同行的阶段。
注意,如果我们向第一个示例添加一个重复的索引值,会发生什么情况。合并列中的重复条目需要特别注意。
staff = pd.DataFrame([1, 2, 3], index=['Sally', 'Sally', 'James'])
student = pd.DataFrame(['Texas', 'Califa', 'South Dakota'],
index=['James', 'Mike', 'Sally'])staff
0
Sally 1 # Kelly Changed to Sally
Sally 2
James 3现在,merge生产:
merged = pd.merge(student, staff, left_index=True, right_index=True,
how='right')merged
0_x 0_y
James Texas 3
Sally South Dakota 1 # Sally is now grouped and sorted last
Sally South Dakota 2为什么?那么,当我们在“萨利”的位置访问索引时,我们指的是什么?哪个值应该合并?这个问题通过对值进行排序和分组来解决,因此它们按顺序出现,并且可以将"Sally (1)“和"Sally (2)”区分为单独的行。
同样,当索引值是唯一的时,不会发生此过程(因为不需要在已经唯一标识的情况下对行进行位置标识)。
为什么解决办法是有效的?那么,索引0处的列值"Sally“以及列值"Sally”和索引1都是唯一标识的。
发布于 2021-07-22 01:40:54
根据文档,https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html pd.merge可以选择在参数中传递排序,将连接键与您的索引进行排序。
staff= pd.DataFrame([1,2,3],index=['Kelly','Sally','James'])
student= pd.DataFrame(['Texas','Califa','South Dakota'],index=
['James','Mike','Sally'])
pd.merge(student,staff,left_index=True,right_index=True,how='right', sort=True)
0_x 0_y
James Texas 3
Kelly NaN 1
Sally South Dakota 2您也可以使用排序索引。
left = pd.DataFrame( { "A": ["A0", "A1", "A2", "A3"], "B": ["B0", "B1", "B2", "B3"]},
index = ["K0", "K1", "K0", "K3"])
right = pd.DataFrame({"C": ["C0", "C1"], "D": ["D0", "D1"]}, index=["K1", "K0"])
pd.merge(left,right,left_index=True,right_index=True,how='right').sort_index(ascending=True)
A B C D
K1 A1 B1 C0 D0
K0 A0 B0 C1 D1
K0 A2 B2 C1 D1https://stackoverflow.com/questions/68478077
复制相似问题