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

如何遍历DataFrame并按多条件生成带清洗值的新test列

解决DataFrame按条件生成新列的问题

需求说明

  • 若PM No_列不为空,test列直接取该列的值
  • 若PM No_列为空,取No_列的值并按Condition列清洗:
    • 当Condition为'9'时,移除No_中的'-0G'
    • 当Condition为'1'时,移除No_中的'-0S'
    • 其他Condition值直接保留No_原值

原代码问题分析

  1. 缩进错误:for循环块内代码未正确缩进
  2. 逻辑倒置:判断PM No_非空时去处理No_,与需求相反
  3. 批量处理错误:使用df['No_'].str.split会返回整个Series,而非当前行的值
  4. 分支不全:未处理Condition为其他值的情况

正确解决方案

方法1:使用apply(直观易读,适合小数据集)

def generate_test(row):
    pm_no = row['PM No_']
    # 处理空字符串或仅含空格的情况
    if pm_no.strip() != '':
        return pm_no
    condition = row['Condition']
    no_val = row['No_']
    if condition == '9':
        return no_val.replace('-0G', '')
    elif condition == '1':
        return no_val.replace('-0S', '')
    else:
        return no_val

df['test'] = df.apply(generate_test, axis=1)

方法2:矢量化操作(高效,适合大数据集)

利用numpy.where和Pandas字符串方法,避免逐行循环:

import numpy as np

# 分层判断赋值
df['test'] = np.where(
    df['PM No_'].str.strip() != '',
    df['PM No_'],
    np.where(
        df['Condition'] == '9',
        df['No_'].str.replace('-0G', '', regex=False),
        np.where(
            df['Condition'] == '1',
            df['No_'].str.replace('-0S', '', regex=False),
            df['No_']
        )
    )
)

验证结果

执行后得到的test列与期望一致:

PM No_ConditionNo_test
GVSU10K20H1GVSU10K20HGVSU10K20H
1Y002VMH51Y002VMH-0H1Y002VMH-0H
92NX00ESRU-0G2NX00ESRU
20WNGE220WNGE20WNGE
1C33761-0SC33761

内容的提问来源于stack exchange,提问作者Asscha197

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:40:36