【问题标题】:Remove specific columns in dataframe with same id on date condition在日期条件下删除具有相同 ID 的数据框中的特定列
【发布时间】:2020-06-26 20:03:13
【问题描述】:

我有两个数据集:

  1. 一个包含过去 10 年颁发的房屋能源证书,其中包含房屋 ID 和颁发日期。一所房子可以颁发更多证书,因为他们可以续签。
  2. 另一个包含过去 10 年的所有房屋交易 和 ID(与第一个数据集中的 id 相同)

我已经使用

合并了它们
mergeALL= pd.merge(mergeTranDwelling,EnergySimple, left_on=['matrikkel2019', "bygningsnr"], right_on=['matrikkel2019', 'Bygningsnummer'], how='inner')

然后我得到这样的东西(数据框片段):


transaction_id  address_id  official_date   certificate     issued_date
83866285    1157600091      2016-05-25      A2012-278940    17.12.2012 17:44:17
83866285    1157600091      2016-05-25      A2012-278941    17.12.2012 17:48:35
83866285    1157600091      2016-05-25      A2016-638538    22.02.2016 10:16:12
83866285    1157600091      2016-05-25      A2016-638577    22.02.2016 10:22:45
83866285    1157600091      2016-05-25      A2019-1065662   21.10.2019 15:39:30



因为每个房屋可以有多个能源证书值,所以每笔交易都可以获得多个附在其上的证书。我希望每个 transaction_id 拥有最接近但在 official_date 之前的 issued_date 证书。在上述情况下,我想删除此 tranasction_id 上的所有证书,除了:

83866285    1157600091      2016-05-25      A2016-638577    22.02.2016 10:22:45

我已尝试使用此解决方案:https://stackoverflow.com/a/60434720/12939497 但我必须合并两列(matrikkel2019,bygningsr)上的数据集,因此我不能使用merge.asof。

我也愿意以另一种方式进行合并(这是关于同一问题的另一个问题:Merging two DataFrames (Datasets) on a specific ID column but with Date condition

【问题讨论】:

  • 检查下面的答案,如果不是你想要的,请告诉我..

标签: python pandas dataframe merge


【解决方案1】:

使用更多地址 transaction_id 扩展您的 df 以进行更好的测试..并从 excel 中获取数据框,您可以根据需要修改该部分..

input_df

transaction_id  address_id  official_date   certificate issued_date
83866285    1157600091  5/25/2016   A2012-278940    17.12.2012 17:44:17
83866285    1157600091  5/25/2016   A2012-278941    17.12.2012 17:48:35
83866285    1157600091  5/25/2016   A2016-638538    22.02.2016 10:16:12
83866285    1157600091  5/25/2016   A2016-638577    22.02.2016 10:22:45
83866285    1157600091  5/25/2016   A2019-1065662   21.10.2019 15:39:30
83866286    1157600093  5/25/2019   A2012-278940    17.12.2012 17:44:17
83866286    1157600093  5/25/2019   A2012-278941    17.12.2012 17:48:35
83866286    1157600093  5/25/2019   A2016-638538    22.02.2016 10:16:12
83866286    1157600093  5/25/2019   A2016-638577    22.02.2016 10:22:45
83866286    1157600093  5/25/2019   A2019-1065662   21.11.2019 15:39:30

..

import pandas as pd
import numpy
import re

input_df = pd.read_excel('input.xlsx',sheet_name='Sheet1')

# convert columns in date time 

input_df['issued_date'] = pd.to_datetime(input_df['issued_date'])
input_df['official_date'] = pd.to_datetime(input_df['official_date'])

# Add below column just for calculation
input_df['diff_days']= (input_df['issued_date']-input_df['official_date']).abs()
print(input_df)

# Filter the group of transaction_id
input_df=input_df.loc[input_df.groupby('transaction_id').diff_days.idxmin()]

# Now remove temp column
input_df = input_df.drop(['diff_days'], axis=1)
print(input_df)

输出 -

   3        83866285  1157600091    2016-05-25   A2016-638577 2016-02-22 10:22:45
   9        83866286  1157600093    2019-05-25  A2019-1065662 2019-11-21 15:39:30

【讨论】:

  • 几乎是我正在寻找的解决方案,但我只想要第一行 (nr 3) 我想要每个交易 id 一个证书,它在 之前具有最接近的 issue_date official_date 并丢弃该 ID 上的所有其他日期。想要对我的数据集中的所有唯一交易 ID 执行此操作
  • 对于您的数据,它只会提供 1 行,我已经添加了 1 个证书的数据,因此它显示 2 行,因为我的数据中有 2 个不同的证书....
  • 是的,好的!我只需要删除 abs() 然后获取所有负数,然后使用 abs() 找到最接近的 issue_date 但在 official_date 之前!非常感谢,你帮了我很多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
相关资源
最近更新 更多