【发布时间】:2021-09-21 18:43:15
【问题描述】:
让我们来看看这两个示例数据框:
df1 = pd.DataFrame({'Id':['A','A','B','C'], 'Date':["2020-03-01","2021-04-21","2020-12-10","2017-01-01"]})
Id Date
0 A 2020-03-01
1 A 2021-04-21
2 B 2020-12-10
3 C 2017-01-01
df2=pd.DataFrame({'Id':['A','A','B'], 'Start':["2020-01-01","2020-02-21","2019-12-10"],
'End':["2021-01-01","2021-02-21","2021-12-10"], "Value":[1,2,3]})
Id Start End Value
0 A 2020-01-01 2021-01-01 1
1 A 2020-02-21 2021-02-21 2
2 B 2019-12-10 2021-12-10 3
我想向 df1 添加一个值列。相应的值可以在 df2 中找到,具有相同的 Id 并且日期(在 df1 中)是否在开始和结束之间(在 df2 中)。如果有多种可能性,我想采用最旧开始日期的值。
我目前使用 for 循环来执行此操作,但是对于我真正的大数据框来说它非常慢,而且我有直觉认为我们可以通过左连接来做到这一点,但我不知道怎么做。请给个主意好吗?
预期输出:
Id Date Valeur
0 A 2020-03-01 1.0
1 A 2021-04-21 NaN
2 B 2020-12-10 3.0
3 C 2017-01-01 NaN
【问题讨论】:
-
pd.merge_asof pandas.pydata.org/docs/reference/api/…
-
@ifly6 - 仅当“Id”为数字时才有效
-
ID是by变量,而不是on变量。没有任何要求它是数字的。Date列需要是连续变量,但支持日期。 -
@ifly6:我真的很想看到一个使用 OP 数据的工作示例
-
@mozway 我再次查看了这个问题,我最初的判断是错误的:OP 正在寻找最旧的匹配(在日期范围内的匹配)而不是最新的匹配。无论如何,它也不会是一个单行过程:as-of 合并需要在匹配日期超过结束日期的地方估算 NA。
标签: python pandas dataframe merge