在特定 ID 列上合并两个 DataFrame(数据集)但具有日期条件
Posted
技术标签:
【中文标题】在特定 ID 列上合并两个 DataFrame(数据集)但具有日期条件【英文标题】:Merging two DataFrames (Datasets) on a specific ID column but with Date condition 【发布时间】:2020-06-11 11:39:54 【问题描述】:我有两个数据集:
一个包含过去 10 年签发的房屋能源证书,带有房屋 ID 和签发日期。一所房子可以颁发更多的证书,因为他们可以更新它。
另一个包含最近10年房屋的所有交易和ID(与第一个数据集中的ID相同)
然后我的问题是找到房子在出售之日的能源证书价值。我能够合并房屋 ID 上的数据集,但不太确定要处理日期列。
能源证书具有“发布日期”列,交易数据集具有“官方销售日期”列。然后,条件将是找到具有正确房屋 ID 的能源证书,然后是最接近销售日期的日期,而不是之后的日期。
数据帧片段:
Transactions:
address_id sold_date
0 1223632151 NaN
1 160073875 2013-09-24
2 160073875 2010-06-16
3 160073875 2009-08-05
4 160073875 2006-12-18
... ... ...
2792726 2147477357 2011-11-03
2792727 2147477357 2014-02-26
2792728 2147477579 2017-05-24
2792729 2147479054 2013-02-04
2792730 2147482539 1993-08-10
Energy Certificate
id certificate_number date_issued
0 1785963944 A2012-274656 27.11.2012 10:32:35
1 512265039 A2010-6435 30.06.2010 13:19:18
2 2003824679 A2014-459214 17.06.2014 11:00:47
3 1902877247 A2011-133593 14.10.2011 12:57:08
4 1620713314 A2009-266 25.12.2009 13:18:32
... ... ... ...
307846 753123775 A2019-1078357 30.11.2019 17:23:59
307847 1927124560 A2019-1078363 30.11.2019 20:44:22
307848 1122610963 A2019-1078371 30.11.2019 22:44:45
307849 28668673 A2019-1078373 30.11.2019 22:56:23
307850 1100393780 A2019-1078377 30.11.2019 23:38:42
想要输出
id certificate_number date_issued sold_date
id = address_id
date_issued <= sold_date
还要找到最接近sold_date的Certificate(售出前最新的) (我知道日期必须是相同的格式)
我正在将 Python 与 Jupyter Notebook 一起使用。
【问题讨论】:
您可以尝试使用merge_asof
带有预期输出的数据帧快照会很有用
@wwnde 是的,抱歉,现在添加。
【参考方案1】:
我认为您需要merge_asof
,但首先需要将列转换为to_datetime
的datetimes
s 并删除sold_date
中缺少值的行DataFrame.dropna
:
df1['sold_date'] = pd.to_datetime(df1['sold_date'])
df2['date_issued'] = pd.to_datetime(df2['date_issued'], dayfirst=True)
df1 = df1.dropna(subset=['sold_date'])
df = pd.merge_asof(df2.sort_values('date_issued'),
df1.sort_values('sold_date'),
left_on='date_issued',
right_on='sold_date',
left_by='id',
right_by='address_id')
【讨论】:
以上是关于在特定 ID 列上合并两个 DataFrame(数据集)但具有日期条件的主要内容,如果未能解决你的问题,请参考以下文章
当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError
在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并