首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫df.merge意想不到的分类行为

熊猫df.merge意想不到的分类行为
EN

Stack Overflow用户
提问于 2021-07-22 01:18:17
回答 2查看 60关注 0票数 0

我无法区分为什么要在两个DFs的索引上进行简单的合并而得到不同的行为。基于文档,我期望得到的数据将遵循正确的DF索引。

案例1

代码语言:javascript
复制
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')

我得到:

代码语言:javascript
复制
        0_x             0_y
Kelly   NaN             22
Sally   South Dakota    38
James   Texas           45

,它遵循正确的DF (人员)索引。

案例2

代码语言:javascript
复制
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')

我得到了

代码语言:javascript
复制
     A  B   C   D
K0  A0  B0  C1  D1
K0  A2  B2  C1  D1
K1  A1  B1  C0  D0

但是,我还以为:

代码语言:javascript
复制
     A  B   C   D
K1  A1  B1  C0  D0
K0  A0  B0  C1  D1
K0  A2  B2  C1  D1

如案例1所示

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-22 01:32:09

问题是索引中的重复值,这需要一些开销来在位置上区分具有相同索引的行。无论merge类型如何,都会发生此过程。注:join也将表现出相同的行为。

要解决这个问题,可以使用reset_index,然后在两个框架上的列"index"上加入,然后在合并的框架上加入set_index,将"index"列返回到DataFrame的索引中。

代码语言:javascript
复制
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 back

merged

代码语言:javascript
复制
     A   B   C   D
K1  A1  B1  C0  D0
K0  A0  B0  C1  D1
K0  A2  B2  C1  D1

为什么一号案子起作用了?对齐过程中导致“意外”行为的部分是使用位置排序来区分具有相同索引的不同行的阶段。

注意,如果我们向第一个示例添加一个重复的索引值,会发生什么情况。合并列中的重复条目需要特别注意。

代码语言:javascript
复制
staff = pd.DataFrame([1, 2, 3], index=['Sally', 'Sally', 'James'])
student = pd.DataFrame(['Texas', 'Califa', 'South Dakota'],
                       index=['James', 'Mike', 'Sally'])

staff

代码语言:javascript
复制
       0
Sally  1  # Kelly Changed to Sally
Sally  2 
James  3

现在,merge生产:

代码语言:javascript
复制
merged = pd.merge(student, staff, left_index=True, right_index=True,
                  how='right')

merged

代码语言:javascript
复制
                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都是唯一标识的。

票数 0
EN

Stack Overflow用户

发布于 2021-07-22 01:40:54

根据文档,https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html pd.merge可以选择在参数中传递排序,将连接键与您的索引进行排序。

代码语言:javascript
复制
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

您也可以使用排序索引。

代码语言:javascript
复制
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  D1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68478077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档