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

DataFrame多列条件赋值代码错误排查求助

多条件批量修改DataFrame列值的错误排查与修正

示例DataFrame

import pandas as pd

data = {"ID": [1,2,3],
        "A": ["", "", ""],
        "B": [2,3,1],
        "C": [1,2,0],
        "var_i3": [0,0,0],
        "var_i4": [0,0,0],
        "var_i5": [0,0,0],
        "var_i6": [0,0,0]
        }
df = pd.DataFrame(data)

需求说明

  • 当A为空字符串且B等于2或3时,将var_i3设为0、var_i4设为1、var_i5设为0
  • 当C等于0时,将var_i6设为13
  • 当C大于等于1时,将var_i6设为0

原代码的错误分析

第一种:apply+自定义函数的错误

原代码:

def process(row):
    if pd.isnull(row["A"]) and row["B"] in [2,3]:
        return row["var_i3"] == 0 & row["var_i4"] == 1 & row["var_i5"] == 0
    elif row["C"] == 0:
        return row["var_i6"] == 13
    else:
        if row["C"] >= 1:
            return row["var_i6"] == 0
        
    return row

df = df.apply(process, axis=1)

错误点:

  1. 空值判断错误:A列是空字符串"",不是NaN,pd.isnull()无法识别空字符串,应改为row["A"] == ""
  2. 赋值逻辑错误:row["var_i3"] == 0是布尔判断,不是赋值操作,不能直接返回该表达式
  3. 分支返回错误:部分分支只返回单个列的判断结果,没有返回完整的行对象,导致DataFrame结构混乱

第二种:np.where+apply的错误

原代码:

def process(row):
    np.where(df["A"].isnull & df["B"] in [2,3], df["var_i3"] == 0 & df["var_i4"] == 1 & df["var_i5"] == 0, 
             np.where(df["C"] == 0, df["var_i6"] == 13, np.where(df["C"] == 1, df["var_i6"] == 0, row)))
df = df.apply(process)

错误点:

  1. 方法调用错误:df["A"].isnull是方法,需加括号调用df["A"].isnull(),且同样无法识别空字符串
  2. 向量判断错误:df["B"] in [2,3]不是pandas向量式判断,应改为df["B"].isin([2,3])
  3. 无返回值:函数内仅调用np.where但未返回结果,apply无法获取修改后的数据
  4. 作用域错误:在按行处理的process函数中直接操作整个df而非传入的row,逻辑混乱
  5. 赋值逻辑错误:依然使用==做布尔判断而非赋值操作

修正后的代码

方法一:修正apply+自定义函数

def process(row):
    # 处理A为空且B为2/3的条件
    if row["A"] == "" and row["B"] in [2,3]:
        row["var_i3"] = 0
        row["var_i4"] = 1
        row["var_i5"] = 0
    # 处理C的条件
    if row["C"] == 0:
        row["var_i6"] = 13
    elif row["C"] >= 1:
        row["var_i6"] = 0
    return row

df = df.apply(process, axis=1)
print(df)

方法二:向量式操作(更高效,推荐)

直接用pandas向量条件赋值,避免逐行循环,性能更优:

# 第一个条件:A为空且B在[2,3]
mask1 = (df["A"] == "") & df["B"].isin([2,3])
df.loc[mask1, ["var_i3", "var_i4", "var_i5"]] = [0, 1, 0]

# 第二个条件:C==0
mask2 = df["C"] == 0
df.loc[mask2, "var_i6"] = 13

# 第三个条件:C>=1
mask3 = df["C"] >= 1
df.loc[mask3, "var_i6"] = 0

print(df)

运行后结果:

ID A  B  C  var_i3  var_i4  var_i5  var_i6
0   1    2  1       0       1       0       0
1   2    3  2       0       1       0       0
2   3    1  0       0       0       0      13

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 00:07:08