首页 > 解决方案 > 左连接日期和 ID 列

问题描述

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 | 项目ID

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 独有的)

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

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 差异,而不是日期。我该如何解决这个问题,使其成为预期的结果?

查看具有 >> 的行

标签: pythonpandas

解决方案


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

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

推荐阅读