代码之家  ›  专栏  ›  技术社区  ›  winlai

删除特定ID组内7天内的观察结果

  •  0
  • winlai  · 技术社区  · 3 周前

    我有一个熊猫数据帧,ID和日期如下:

    身份证件 日期
    111 16/09/2021
    111 14/03/2022
    111 18/03/2022
    111 21/03/2022
    111 22/03/2022
    222 27/03/2022
    222 30/03/2022
    222 4/04/2022
    222 6/04/2022
    222 13/04/2022

    对于每个ID,我想过滤表格并删除彼此之间7天内的观察结果。但我想保留彼此相隔7天以内的日期中的最早日期,这样每个ID都将具有相隔7天以上的唯一日期,并且不包含其间的其他日期:

    身份证件 日期
    111 16/09/2021
    111 14/03/2022
    111 22/03/2022
    222 27/03/2022
    222 4/04/2022
    222 13/04/2022

    我对python和pandas数据帧还很陌生,所以希望有人能提供一些帮助。还有一个类似的SO问题 How do I remove observations within 7 days of each other within a specific ID group? 但这是在R中完成的,所以希望对熊猫也能做类似的事情。

    1 回复  |  直到 3 周前
        1
  •  0
  •   Jordan    3 周前

    这是一个使用panda的python版本,它保留最早的日期,然后删除该日期7天窗口内的任何后续日期:

    import pandas as pd
    
    def filter_dates(group):
        group = group.sort_values(by='Date')
        filtered_dates = []
        last_date = None
        for date in group['Date']:
            if last_date is None or (date - last_date).days > 7:
                filtered_dates.append(date)
                last_date = date
        return group[group['Date'].isin(filtered_dates)]
    
    
    if __name__ == "__main__":
        data = {
            'ID': [111, 111, 111, 111, 111, 222, 222, 222, 222, 222],
            'Date': ['16/09/2021', '14/03/2022', '18/03/2022', '21/03/2022', '22/03/2022',
                     '27/03/2022', '30/03/2022', '04/04/2022', '06/04/2022', '13/04/2022']
        }
        df = pd.DataFrame(data)
        df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
        result_df = df.groupby('ID').apply(filter_dates, include_groups=False).reset_index(drop=True)
        print(result_df)
    

    在这篇文章中,我将其转换为日期时间格式,然后按ID对其进行分组。filter_data()函数然后删除彼此相距7天以内的日期。

    它打印出以下内容:

        ID  level_1       Date
    0  111        0 2021-09-16
    1  111        1 2022-03-14
    2  111        4 2022-03-22
    3  222        5 2022-03-27
    4  222        7 2022-04-04
    5  222        9 2022-04-13