【问题标题】:Pandas "join" oddity熊猫“加入”怪事
【发布时间】:2018-11-26 16:37:01
【问题描述】:

如果我尝试这个(pandas 的两个不同年份,一个在 Python 2 中,另一个在 Python 3 中)

import pandas as pd
x = pd.DataFrame({"id": [1, 2,3], "value1": [5,5,5]})
y = pd.DataFrame({"id": [1], "value2": [10]})

z1 = x.join(y, on = "id")
z2 = x.join(y, on = "id", lsuffix = "_left", rsuffix = "_right")
z3 = x.join(y, lsuffix = "_left", rsuffix = "_right")

第一个连接失败并返回ValueError,第二个没有中断但y 不匹配,只有第三个连接产生预期结果,即y 的行匹配到x .

join 的文档说

on : 名称、元组/名称列表或类似数组 调用者中的列或索引级别名称以加入其他索引, 否则加入 index-on-index。如果给定多个值,则另一个 DataFrame 必须有一个 MultiIndex。如果还没有,可以将数组作为连接键传递 包含在调用 DataFrame 中。类似于 Excel VLOOKUP 操作。

这是一个错误(即z2 会发生什么),还是有某种意义?

【问题讨论】:

  • 为什么 1 会失败?

标签: python pandas join merge


【解决方案1】:

df.join(...) 通常用于将df 的索引与另一个DataFrame 的索引连接起来。

df.join(..., on='id')dfid 列与另一个DataFrame 的索引连接起来。 Per the docs(我的重点):

on : 名称、元组/名称列表或类似数组

调用者中的列或索引级别名称加入 other 中的索引,否则加入 index-on-index。如果给定多个值,则另一个 DataFrame 必须具有 MultiIndex。如果它尚未包含在调用 DataFrame 中,则可以将数组作为连接键传递。类似于 Excel VLOOKUP 操作

由于xy 看起来像这样:

In [14]: x
Out[14]: 
   id  value1
0   1       5
1   2       5
2   3       5

In [15]: y
Out[15]: 
   id  value2
0   1      10

x.join(y, on='id') 尝试将x['id'](值1, 2, 3)与y.index(值0)连接起来。由于 x['id']y.index 没有共同的值,因此(默认情况下)左连接会为连接生成的新 y 列中的值生成 NaN。


z1 = x.join(y, on = "id") 加注

ValueError: columns overlap but no suffix specified: Index(['id'], dtype='object')

因为连接产生的y-columns 包括id,这已经是一个 x-列名。当列名重叠时,必须指定一个lsuffixrsuffix,或两者兼而有之,以消除列名的歧义。


z2 = x.join(y, on = "id", lsuffix = "_left", rsuffix = "_right") 返回

In [12]: z2
Out[12]: 
   id_left  value1  id_right  value2
0        1       5       NaN     NaN
1        2       5       NaN     NaN
2        3       5       NaN     NaN

因为常见的xy-列(即id 列)已消除歧义。 NaN 值是由于 x['id']y.index 没有共同的值(如上所述)。


z3 = x.join(y, lsuffix = "_left", rsuffix = "_right") 产生

In [20]: z3
Out[20]: 
   id_left  value1  id_right  value2
0        1       5       1.0    10.0
1        2       5       NaN     NaN
2        3       5       NaN     NaN

因为现在正在x.indexy.index 上执行连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-25
    • 2014-09-21
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2016-06-04
    • 2020-09-19
    相关资源
    最近更新 更多