运行 df.apply 在循环中使用 lambda 函数

run df.apply with lambda function in a loop

此代码片段运行良好:

df['art_kennz'] = df.apply(lambda x:myFunction(x.art_kennz), axis=1)

但是,这里我在两个地方硬编码了列名称 art_kennzdf['art_kennz']x.art_kennz。现在,我想修改脚本,以便我有一个列名列表,并且 df.apply 对所有这些列运行。所以我尝试了这个:

cols_with_spaces = ['art_kennz', 'fk_wg_sch']
for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda x: myFunction(x.col_name)
                                               , axis=1)

但这给出了一个错误:

AttributeError: 'Series' object has no attribute 'col_name'

因为 x.col_name。这里,col_name 应该是 for 循环中的元素。正确的语法是什么?

尝试:

for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda x: myFunction(x[col_name])

说明:您可以使用属性语法访问 Serie,例如 x.art_kennz,但由于 col_name 是一个包含表示属性的字符串的变量,因此括号语法是正确的方法。

在这种情况下 x.art_kennz 您使用字符串,但在 for-loop 中您有不能使用的变量 .variables

试试这个:(在这种方法中,您逐行迭代)

for col_name in cols_with_spaces:
    df[col_name] = df.apply(lambda row: myFunction(row[col_name]), axis=1)

如果你想逐列迭代你可以试试这个:

for col_name in cols_with_spaces:
    df[col_name] = df[col_name].apply(myFunction)