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)
错误点:
- 空值判断错误:
A列是空字符串"",不是NaN,pd.isnull()无法识别空字符串,应改为row["A"] == "" - 赋值逻辑错误:
row["var_i3"] == 0是布尔判断,不是赋值操作,不能直接返回该表达式 - 分支返回错误:部分分支只返回单个列的判断结果,没有返回完整的行对象,导致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)
错误点:
- 方法调用错误:
df["A"].isnull是方法,需加括号调用df["A"].isnull(),且同样无法识别空字符串 - 向量判断错误:
df["B"] in [2,3]不是pandas向量式判断,应改为df["B"].isin([2,3]) - 无返回值:函数内仅调用
np.where但未返回结果,apply无法获取修改后的数据 - 作用域错误:在按行处理的
process函数中直接操作整个df而非传入的row,逻辑混乱 - 赋值逻辑错误:依然使用
==做布尔判断而非赋值操作
修正后的代码
方法一:修正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
相关产品推荐
相关产品推荐

