Pandas追加符合条件行到df_VOIDS并更新Drop_Reason值方法
Pandas 多条件筛选行并跨表移动实现方案
实现思路
核心逻辑是将所有阈值判定规则做可配置化处理,无需修改核心流程即可新增/调整判定条件,同时自动完成命中原因标注、表结构对齐、行迁移全流程:
- 提前对齐两个DataFrame的列名格式,避免追加数据时出现冗余列
- 规则以结构化列表存储,每条规则包含「待判定字段名、判定逻辑、命中原因」三个属性,适配多规则扩展需求
- 逐规则匹配行时优先标记首个命中的原因,避免重复赋值
- 完成标记后拆分数据:命中规则的行追加到
df_VOIDS,剩余行保留在df_Clean
前置说明
样例数据中两个表的列名存在格式差异:df_Clean列名带空格(如Phase Max),df_VOIDS列名以下划线分隔(如Phase_Max),代码中会先做统一对齐处理。
可直接运行的代码实现
import pandas as pd # -------------------------- # 1. 配置判定规则,新增规则直接往这个列表追加即可 # 格式:(df_Clean中的原字段名, 判定lambda函数, 命中后的Drop_Reason值) # -------------------------- judge_rules = [ ("Phase Max", lambda x: x > 10, "above phase max"), ("Force Max", lambda x: x > 80, "above force max"), ("Force Avg", lambda x: x > 60, "above force avg"), ("THD Max", lambda x: x > 20, "above thd max"), # 新增规则直接在下方按格式追加即可 ] # -------------------------- # 2. 预处理:对齐df_Clean列名和df_VOIDS格式一致 # -------------------------- # 把df_Clean的列名空格替换为下划线 df_Clean.columns = [col.replace(" ", "_") for col in df_Clean.columns] # 给df_Clean初始化Drop_Reason列,默认空值 df_Clean["Drop_Reason"] = pd.NA # -------------------------- # 3. 逐规则打标 # -------------------------- for col, condition, reason in judge_rules: col_aligned = col.replace(" ", "_") # 仅给还没标记原因的行判断是否命中当前规则,命中则赋值原因 mask = df_Clean["Drop_Reason"].isna() & df_Clean[col_aligned].apply(condition) df_Clean.loc[mask, "Drop_Reason"] = reason # -------------------------- # 4. 拆分数据完成迁移 # -------------------------- # 筛选所有命中规则的行 to_move_rows = df_Clean[df_Clean["Drop_Reason"].notna()].copy() # 填充Void列值,和df_VOIDS现有数据保持一致 to_move_rows["Void"] = "Void" # 追加到df_VOIDS,自动忽略重复索引 df_VOIDS = pd.concat([df_VOIDS, to_move_rows], ignore_index=True) # 从df_Clean中移除已迁移的行,删除临时的Drop_Reason列后重置索引 df_Clean = df_Clean[df_Clean["Drop_Reason"].isna()].drop(columns=["Drop_Reason"]).reset_index(drop=True)
自定义调整说明
- 如果需要记录单行命中的所有规则(而非仅首个命中的规则),可以把打标逻辑从直接赋值改为字符串拼接,例如:
df_Clean.loc[mask, "Drop_Reason"] = df_Clean.loc[mask, "Drop_Reason"].fillna("") + f"{reason};" - 如果需要调整判定方向(比如小于阈值判定为不合格),直接修改规则里的lambda函数即可,例如
lambda x: x < 5对应低于阈值的场景 - 如果两个表列名已经完全一致,可以跳过列名对齐的步骤
内容的提问来源于stack exchange,提问作者Nick_Jo
相关产品推荐
相关产品推荐

