如何在Pandas DataFrame中移除间隔≤4天的连续行(保留首行)
Pandas DataFrame按日期间隔过滤:保留间隔>4天的首行
需求:处理Pandas DataFrame时,需按以下规则筛选行:
- 以第一行为基准,后续行若和最近保留的行日期间隔≤4天,就移除;
- 若间隔超过4天,就保留该行,并把它作为新的基准继续对比后面的行。
举个例子:
- 2018-02-20和2018-02-16间隔≤4天 → 删掉2018-02-20那行
- 删掉后,用2018-02-16和2018-02-21对比,间隔5天(>4天)→ 留着2018-02-21
- 2018-02-22和2018-02-21间隔1天 → 删掉2018-02-22
- 2018-02-26和2018-02-21间隔5天 → 留着2018-02-26
示例输入
先构造示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'Date': ['2018-02-16', '2018-02-20', '2018-02-21', '2018-02-22', '2018-02-26', '2018-03-01', '2018-03-02', '2012-09-28', '2012-10-01', '2012-10-02', '2012-10-21'], 'Open': [69.75, 65.7, 60.0, 67.65, 77.666666, 73.5, 66.75, 0.5, 0.5, 0.575, 0.13] }, index=[0,1,2,3,4,8,9,3,4,5,6])
解决方案
下面是实现逻辑的代码:
# 把Date列转成日期格式,才能计算天数差 df['Date'] = pd.to_datetime(df['Date']) # 初始化一个列表,标记哪些行要保留,默认第一行留着 keep = [True] * len(df) # 记录上一个保留行的日期,先拿第一行的日期当基准 last_keep_date = df['Date'].iloc[0] # 从第二行开始遍历每一行 for i in range(1, len(df)): current_date = df['Date'].iloc[i] # 算当前行和上一个保留行的天数差 days_diff = (current_date - last_keep_date).days if days_diff <= 4: # 间隔≤4天,标记为不保留 keep[i] = False else: # 间隔>4天,标记为保留,同时更新基准日期 keep[i] = True last_keep_date = current_date # 用标记列表过滤原DataFrame,得到结果 result_df = df[keep]
代码解释
- 先转日期格式是必须的,不然字符串没法算天数差;
- 遍历的时候不是和相邻行比,而是和上一个成功保留的行比,这是核心逻辑;
- 每保留一行就更新基准日期,确保后续对比的是最近的保留行。
最终结果
运行代码后得到的result_df就是期望的结果:
Date Open 0 2018-02-16 69.750000 2 2018-02-21 60.000000 4 2018-02-26 77.666666 3 2012-09-28 0.500000 6 2012-10-21 0.130000
内容的提问来源于stack exchange,提问作者MasayoMusic
相关产品推荐
相关产品推荐

