【问题标题】:Left join with date and ID column左连接日期和 ID 列
【发布时间】:2020-06-17 05:30:21
【问题描述】:

1[]1

假设这是 CSV1:

开始日期 |结束日期 |项目 | CSV1UQID

1999-09-27 | 9999-12-31 | 100000 | 121

1999-10-27 | 9999-12-31 | 100001 | 123

1222-09-27 | 9999-12-31 | 999999 | 125

和 CSV2:

CSV2开始日期 | CSV2ENDDATE |项目编号

1998-09-27 | 9999-12-31 | 100000

1999-10-27 | 9999-12-31 | 100001

我想根据它们的列加入这些表,特别是它们的差异中的 STARTDATE、ENDDATE 或 ITEMID,以显示它们是否是数据帧独有的差异。我分别缩短了原始数据帧 csv1 和 csv2,因为它们包含 5000+ 行,因此数据显示整齐会有好处。

这些是我想要产生的结果 Left Join Null(又名 CSV1 独占):

开始日期 |结束日期 |项目 | CSV1UQID

1999-09-27 | 9999-12-31 | 100000 | 121(此行在左连接中,为空,因为与 CSV2STARTDATE 相比,CSV1 的开始日期是唯一的)

1222-09-27 | 9999-12-31 | 999999 | 125(因为所有参数都是CSV1独有的)

但是,到目前为止,我的代码是左连接(null):

csv1iID = csv1.set_index('ITEMID')
csv2iID = csv2.set_index('ITEMID')

CSV1only = csv1.join(
    csv2iID,
    on = 'ITEMID', 
    lsuffix = '_l',
    rsuffix = '_r',
).query('ITEMID_r.isnull()')

但这只会产生:

开始日期 |结束日期 |项目 | CSV1UQID

1222-09-27 | 9999-12-31 | 999999 | 125

因为它只查看 ITEMID 差异,而不是日期。我该如何解决这个问题,使其成为预期的结果?

查看具有 >>

的行

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    外连接的indicator参数将返回值是在左、右还是两者。您可以通过 df['_merge'] == 'left_only' 过滤生成的 df 以获取仅左侧的记录等。

    df1

    STARTDATE       ENDDATE     ITEMID  CSV1UQID
    0   1999-09-27  9999-12-31  100000  121
    1   1999-10-27  9999-12-31  100001  123
    2   1222-09-27  9999-12-31  999999  125
    

    df2

    STARTDATE       ENDDATE     ITEMID
    0   1998-09-27  9999-12-31  100000
    1   1999-10-27  9999-12-31  100001
    
    
    df1.merge(df2, how='outer', on=['STARTDATE','ENDDATE','ITEMID'], indicator=True)  
    

    输出

        STARTDATE   ENDDATE     ITEMID  CSV1UQID    _merge
    0   1999-09-27  9999-12-31  100000  121.0       left_only
    1   1999-10-27  9999-12-31  100001  123.0       both
    2   1222-09-27  9999-12-31  999999  125.0       left_only
    3   1998-09-27  9999-12-31  100000  NaN         right_only
    

    【讨论】:

    • 你好克里斯,我相信会发生这种情况:文件“”,第 1 行 csv1[_merge'] == 'left_only' ^ SyntaxError: invalid syntax
    • 我错过了 _merge 左侧的单引号,已更新。
    • 你好克里斯,代码本身可以工作,但不会产生左连接的预期结果,null。我认为您的代码只是正常的左连接
    • 这是一个外连接,它从两边返回所有内容,您可以过滤仅左、仅右或两者。您的数据集中没有与所有 3 列匹配的记录。也许我错过了什么。
    • 左连接,null 仅描述左数据帧中的行,专属于它。正常的左连接包括右数据框中的行,但我需要前者而不是后者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-01-04
    • 1970-01-01
    相关资源
    最近更新 更多