python - 左连接日期和 ID 列
问题描述
假设这是 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 差异,而不是日期。我该如何解决这个问题,使其成为预期的结果?
查看具有 >> 的行
解决方案
外连接的指示符参数将返回值是在左、右还是两者。您可以过滤生成的 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
推荐阅读
- laravel - Laravel - 未连接到 docker 上的数据库
- git - Jenkins pipline checkout 使用副本而不是 git clone
- neo4j - 未创建或更新节点之间的关系
- pine-script - PinScript:策略关闭
- postgresql - Postgresql中的时间窗口滚动总和
- javascript - Highcharts 瀑布图在一个系列中显示未知数
- ffmpeg - 将任何输入视频文件转换为 mxf 失败
- arrays - 如何快速打印字符串数组的单个元素
- c++ - 从曲线和线条生成文本
- python-3.x - 将 3 列 csv 读入嵌套字典