Python 删除日期条件下具有相同id的dataframe中的特定列
我有两个数据集:Python 删除日期条件下具有相同id的dataframe中的特定列,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我有两个数据集: 其中一个包含过去10年颁发的房屋能源证书,以及房屋ID和颁发日期。一个房子可以有更多的证书颁发,因为他们可以更新它 另一个包含过去10年的所有房屋交易 和ID(与第一个数据集中的ID相同) 我使用 mergeALL= pd.merge(mergeTranDwelling,EnergySimple, left_on=['matrikkel2019', "bygningsnr"], right_on=['matrikkel2019', 'Bygningsnummer'], how=
mergeALL= pd.merge(mergeTranDwelling,EnergySimple, left_on=['matrikkel2019', "bygningsnr"], right_on=['matrikkel2019', 'Bygningsnummer'], how='inner')
然后我得到了如下内容(dataframe的片段):
因为每个房屋可以有多个能源证书值,所以每笔交易都可以附带多个证书。我希望每个交易\u id都有颁发日期为的证书,该日期最近,但在正式日期之前。在上述情况下,我希望删除此传输id上的所有证书,除了:
83866285 1157600091 2016-05-25 A2016-638577 22.02.2016 10:22:45
我已尝试使用此解决方案:
但是我必须合并两列上的数据集(matrikkel2019,bygningsr),因此我不能使用merge.asof
我也愿意以另一种方式进行合并(这是关于同一问题的另一个问题:)使用一个地址事务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
输出-
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一个证书,在正式日期之前有最近的发布日期,并丢弃该ID上的所有其他。要对我的数据集中的所有唯一事务ID执行此操作,对于您的数据,它将只给出1行,我为1个证书添加了数据,因此它显示了2行,因为我的数据中有2个不同的证书…是的,好的!我只需删除abs(),然后获取所有负面日期,然后在之后使用abs()查找最接近的发行日期,但在正式发行日期之前!非常感谢你,你帮了我很多
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