在特定 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_datetimedatetimess 并删除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

在 2 列上合并 pandas 数据帧,但以任意顺序

当列中的项目是列表时,列上的合并 Pandas DataFrame 的 TypeError

在 Python 3.x 中将基于特定列的列和值的两个 DataFrame 与 Pandas 合并

使用一系列列合并两个 DataFrame(在 ID 上右侧,在多个 ID 上左侧)

合并两个具有相同列名但在熊猫中列数不同的数据框