【问题标题】:Joining two Pandas DataFrames does not work anymore?加入两个 Pandas DataFrame 不再起作用?
【发布时间】:2015-06-16 20:46:02
【问题描述】:

我有 2 个 Pandas 数据框。

第一个看起来像这样:

date           rank   id       points
2010-01-04     1      100001   10550
2010-01-04     2      100002    9205

第二个是这样的:

id       name   
100001   A    
100002   B   

我想通过id 列加入两个数据框。所以结果应该是这样的:

date           rank    id       points  name  
2010-01-04     1       100001   10550   A    
2010-01-04     2       100002    9205   B 

几周前我为此编写了代码,但由于某种原因它不再起作用了。执行此加入代码后,我得到一个空数据框:

join = pd.merge(df1,df2, on='id')

为什么join 是空的?

【问题讨论】:

  • 啊,ID 列似乎有问题。对于 df1 它们是对象类型,对于 df2 它们是整数。因此,加入不起作用...
  • 请编辑以包含print(df1["id"])print(df2["id"])) 的结果(这可能会显示问题。) --update: 看起来这就是问题所在。 :-) 您可能正在将字符串与整数进行比较。你现在可以回答你自己的问题了..

标签: join pandas merge dataframe


【解决方案1】:

短篇小说:正如comment 中已经指出的那样,我正在将字符串与整数进行比较。

长话短说:我没想到 python 会将两个输入 csv 文件的 id 列解析为不同的数据类型。 df1.id 属于 Object 类型。 df2.id 是 int 类型。我需要找出为什么 df1.id 被解析为 Object 而不是自动解析为 int,因为它只包含数字。

原来这与我的 CSV 文件的编码有关。在记事本++中,该文件被编码为纯 UTF-8。 pandas 似乎不喜欢这样,因为当我尝试将 id 列转换为 int 时,它引发了类似ValueError: invalid literal for int() with base 10: '\ufeff100001' 的错误。数字100001 是第一行的第一个 ID。所以在这个数字之前(在文件的开头)\ufeff 之前似乎有一些编码字符阻止了 pandas 将整个列解析为 int。在记事本++中,我将文件的编码更改为UTF-8 without BOM,然后一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多