如何遍历DataFrame多列并应用Lambda函数进行数据处理?
解决DataFrame多列批量应用lambda函数的问题
嘿,我懂你现在的卡点——要给50列(Column1到Column50)都执行一模一样的逻辑,但原来的循环写法里,lambda函数没法正确引用当前遍历的列,对吧?我先帮你分析下原代码的问题,再给你两个靠谱的解决方案:
原代码的核心问题
你写的循环里有两个关键问题:
- lambda里的
x.column是错误的:df.apply(axis=1)返回的x是行对象,x.column会被当成行的column属性,而不是你循环里的列变量,所以根本取不到目标列的值。 - 条件表达式不完整:
if后面没有对应的else分支,运行时会抛出语法错误,apply也无法处理缺失返回值的情况。
解决方案一:用向量化的np.where(强烈推荐)
如果你的数据量不小,向量化操作比逐行的apply效率高太多,50列的场景下差距会特别明显。用np.where可以直接对整列进行条件判断和赋值:
import numpy as np # 先定义要处理的50列列表 target_columns = [f"Column{i}" for i in range(1, 51)] for col in target_columns: # 逻辑:如果当前列的值 >= datacolumn3,就用datacolumn*datacolumn2替换,否则保留原列值 df[col] = np.where( df[col] >= df["datacolumn3"], df["datacolumn"] * df["datacolumn2"], df[col] # 这里可以改成你需要的默认值,比如0或者NaN )
解决方案二:用闭包修正apply写法(适合小数据量)
如果你一定要用apply,可以通过闭包传递列名的方式,让lambda能正确捕获当前循环的列变量,同时补全else分支:
target_columns = [f"Column{i}" for i in range(1, 51)] for col in target_columns: df[col] = df.apply( lambda x, current_col=col: x["datacolumn"] * x["datacolumn2"] if x[current_col] >= x["datacolumn3"] else x[current_col], axis=1 )
这里的关键是给lambda加了current_col=col的默认参数,这样每个循环迭代时,lambda都会绑定当前的列名,不会出现变量引用错误。
内容的提问来源于stack exchange,提问作者lilbit
相关产品推荐
相关产品推荐

