【问题标题】:run df.apply with lambda function in a loop在循环中使用 lambda 函数运行 df.apply
【发布时间】:2021-11-26 14:03:33
【问题描述】:

这段代码sn-p运行良好:

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 循环的元素。正确的语法是什么?

【问题讨论】:

  • 如果 myFunction 可以与系列一起使用,您可以使用:df[list_of_cols] = df[list_of_cols].apply(lambda x: myFunction(x), axis=1)

标签: python pandas dataframe data-analysis attributeerror


【解决方案1】:

在这种情况下 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)

【讨论】:

    【解决方案2】:

    试试:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-22
      • 1970-01-01
      • 2020-08-08
      相关资源
      最近更新 更多