Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除日期条件下具有相同id的dataframe中的特定列_Python_Pandas_Dataframe_Merge - Fatal编程技术网

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=

我有两个数据集:

  • 其中一个包含过去10年颁发的房屋能源证书,以及房屋ID和颁发日期。一个房子可以有更多的证书颁发,因为他们可以更新它
  • 另一个包含过去10年的所有房屋交易 和ID(与第一个数据集中的ID相同)
  • 我使用

    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