首页 > 解决方案 > 一旦遇到一行,在 40 天内删除所有行,然后重复

问题描述

我有以下数据框,按 ID 和 Date 排序:

东风:

ID     Date
A      2019-01-02
A      2019-02-09
A      2019-02-20
A      2019-02-27
A      2019-03-16
A      2019-03-29
A      2019-04-17
A      2019-04-19
A      2019-05-26
A      2019-06-12
B      2017-01-01
B      ...

我想要的是,当我遇到一行时,在接下来的 40 天内删除所有带有日期的行,并从我遇到的下一个(未删除的)行开始重复。我想要每个ID。

例如 ID=A :

请注意,我的 40 天期限是从我遇到新行时开始的,并且当前没有 40 天期限处于活动状态。因此,对于所有 ID,这些时间段并不相同。

这给出了以下输出数据集

ID     Date
A      2019-01-02
A      2019-02-20
A      2019-04-17
A      2019-06-12
B      2017-01-01
B      ...

提前致谢

标签: pythonpandasdataframe

解决方案


您可以遍历数据框以创建过滤器

import pandas as pd
import datetime 

# create your dataframe "df" here...
# with columns "ID" and "Date"

# make sure your Date is a datetime field!
df['Date'] = pd.to_datetime(df['Date'])

prev_id = None
prev_date = None
keep_rows = []

for _, row in df.iterrows():

    if row['ID'] == prev_id:
        delete = (row['Date'] - prev_date) < datetime.timedelta(days=40) 
        if delete:
            keep_rows.append(False)    
            continue
        
    keep_rows.append(True)
    prev_id = row['ID']
    prev_date = row['Date']

并像这样过滤您的数据框

df[keep_rows]

推荐阅读