You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 07:06:19