【问题标题】:Trouble with left joining tables pandas (ValueError: You are trying to merge on object and int64 columns.) [duplicate]左连接表 pandas 出现问题(ValueError:您正在尝试合并 object 和 int64 列。)[重复]
【发布时间】:2019-08-12 04:58:41
【问题描述】:

我有两个列表,我想加入其中一个。

这就是我生成第一个列表的方式:

# NB Oracle connection
first_list = pd.read_sql('SELECT firstname, lpad(identifier, 4, 0) from table1', con=Connection)

第二名单:

second_list = pd_read_excel('excelfile.xlsx', converters={'identifier': str})

稍微简化一下:第一个列表如下所示:

   name  identifier
0  Firstname     1201
1  Secondname       0
2  Thirdname     1855
3  Fourthname    3333
4  Fifthname     1414

第二个列表如下所示:

   identifier    BIC          BANK
0  0             UNKNOWN      Unknown
1  1201          DNBANKNOKK   DNB Bank ASA 
2  1855          EIDSNO21     Eidsberg Sparebank
3  3333          RYGSNO21     Sparebank1 Østfold Akershus
4  1414          LOSKNO21     Sparebank 1 Lom og Sjåk

我希望最终列表如下所示:

   name          identifier  BIC          BANK
0  Firstname     1201        DNBANKNOKK   DNB Bank ASA
1  Secondname       0        UNKNOWN      Unknown
2  Thirdname     1855        EIDSNO21     Eidsberg Sparebank
3  Fourthname    3333        RYGSNO21     Sparebank1 Østfold Akershus
4  Fifthname     1414        LOSKNO21     Sparebank 1 Lom og Sjåk

但是,当我尝试生成最终列表时:

final_list = first_list.join(second_list, on='identifier', how='left')

我收到以下错误:ValueError:您正在尝试合并 object 和 int64 列。如果你想继续,你应该使用 pd.concat

当我尝试这个时,我得到了同样的错误:

first_list['identifier'] = first_list['identifier'].astype(str)
second_list['identifier'] = second_list['identifier'].astype(str)
final_list = first_list.join(second_list, on='identifier', how='left')

运行 dtypes 将两个列表标识符作为对象返回。

【问题讨论】:

    标签: python sql excel oracle pandas


    【解决方案1】:

    尝试如下使用merge

    import pandas as pd
    
    final_list = pd.merge(first_list, second_list, how='outer',left_on=['identifier'], right_on=['identifier'])
    

    【讨论】:

      【解决方案2】:

      pandas.DataFrame.mergehow='left' 一起使用:

      final_list = pd.merge(first_list, second_list, on='identifier', how='left')
      
      print(final_list)
               name  identifier         BIC                         BANK
      0   Firstname        1201  DNBANKNOKK                 DNB Bank ASA
      1  Secondname           0     UNKNOWN                      Unknown
      2   Thirdname        1855    EIDSNO21           Eidsberg Sparebank
      3  Fourthname        3333    RYGSNO21  Sparebank1 Østfold Akershus
      4   Fifthname        1414    LOSKNO21      Sparebank 1 Lom og Sjåk
      

      可以在这里找到关于pandas 中的merging 的详细说明:
      Pandas Merging 101

      【讨论】:

      • 谢谢,使用左连接合并解决了这个问题:) 我猜合并比连接“更好”。我会记住这一点的。
      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-15
      • 2017-03-17
      • 2021-03-13
      • 2011-10-22
      相关资源
      最近更新 更多