Pandas DataFrame如何删除含至少一条异常数据的整天记录
Pandas 按自然日删除含异常值的全量记录方案
核心逻辑是先标记所有存在异常的日期,再批量过滤对应日期的所有行,完全不依赖异常出现位置,10万行规模下运行无性能压力。
实现步骤
- 从时间索引中提取每条记录对应的自然日维度
- 按自然日分组,识别出存在至少1条
to_delete=True异常记录的日期 - 过滤原数据集,剔除所有异常日期对应的行记录
代码实现
写法1:逻辑清晰易读(适合新手)
import pandas as pd # 从带时区的时间索引提取对应自然日,避免时区转换导致日期偏移 df['cal_date'] = df.index.date # 分组计算每个自然日是否存在异常,取出所有需要删除的日期 to_remove_dates = df.groupby('cal_date')['to_delete'].any() to_remove_dates = to_remove_dates[to_remove_dates].index # 过滤数据,删除临时列得到最终结果 df_clean = df[~df['cal_date'].isin(to_remove_dates)].drop(columns=['cal_date'])
写法2:简洁无临时列
不需要生成辅助列,直接对时间索引按天取整计算,代码更精简:
# 取出所有异常记录对应的日期(去重),直接过滤非异常日期的记录 df_clean = df[~df.index.floor('d').isin(df[df['to_delete']].index.floor('d').unique())]
方案优势
- 不受异常值出现位置影响,不管异常在当日0点还是23点55分,都能准确删除当日全量数据
- 不依赖单日固定288条记录的硬编码逻辑,即使存在数据缺采、补采的情况,也不会出现错删、漏删
- 基于pandas原生向量化运算,10万行数据毫秒级完成计算,性能足够
拿给出的示例数据测试,2019-01-01、2019-01-03因为存在异常记录会被整段删除,最终仅保留2019-01-02的正常数据,完全符合需求。
内容的提问来源于stack exchange,提问作者Emanuel Gonçalves
相关产品推荐
相关产品推荐

