如何高效过滤pandas DataFrame,基于多列条件识别价格递增异常记录
高效识别pandas中价格序列异常记录的实现方案
核心逻辑全部使用pandas原生向量化操作,底层由C实现,无Python层循环开销,适合千万级及以上体量的DataFrame使用。
实现步骤
- 预处理排序:先按
id和zone升序排列,确保每个id下的记录严格按照zone 1到zone 5的顺序排列,避免zone乱序导致判断错误
import pandas as pd # 此处df为你原始的DataFrame df = df.sort_values(by=['id', 'zone'], ignore_index=True) # 可选前置校验:过滤掉记录数不足5的异常id,按需开启 # df = df[df.groupby('id')['id'].transform('count') == 5]
- 标记异常记录:通过分组差分和位移标记相邻逆序的记录,完全匹配"相邻逆序则两条均为异常"的规则
# 标记当前行和前一行价格逆序的位置 df['curr_reverse'] = df.groupby('id')['price'].diff() <= 0 # 标记前一行和当前行逆序的位置(即当前逆序的前一条也要算异常) df['prev_reverse'] = df.groupby('id')['curr_reverse'].shift(-1, fill_value=False) # 合并异常标记 df['is_abnormal'] = df['curr_reverse'] | df['prev_reverse']
- 导出异常记录
# 筛选异常记录,删除中间辅助列 abnormal_records = df[df['is_abnormal']].drop(columns=['curr_reverse', 'prev_reverse', 'is_abnormal']) # 导出到csv文件 abnormal_records.to_csv('abnormal_price_records.csv', index=False, encoding='utf-8-sig')
逻辑验证
你提供的示例数据经过上述逻辑处理后,第二行的差分为24-33=-9 <=0,因此curr_reverse在第二行标记为True,prev_reverse在第一行标记为True,最终前两行的is_abnormal均为True,和要求的异常判定结果完全一致。
内容的提问来源于stack exchange,提问作者Sithija Piyuman Thewa Hettige
相关产品推荐
相关产品推荐

