【问题标题】:DataFrame .apply Function with Multiple Conditions returning ValueError具有多个条件的 DataFrame .apply 函数返回 ValueError
【发布时间】:2020-05-26 22:47:03
【问题描述】:

我有一个 DataFrame,其中 ['used'] 列的值有时为 0,即使 ['required'] 列在数字中具有值列表。在这种情况下,这是一个输入错误,我正在尝试将 ['used'] 列中的值更改为等于 ['required'] 列值。

这是我试图定义的函数。我更喜欢调用函数,因为带有条件语句的 lambda 语法可能会令人困惑:

def missing_value(df):
    numbers = [20, 35, 75]
    for number in numbers:
        if (df['required']==number) and (df['used']==0):
            df['used']==df['required']

# Apply function on column
df = df.apply(missing_value(df), axis=1)

一直返回ValueError:Series的真值不明确。当我尝试运行代码时,请使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

是数据类型与条件不匹配的问题还是我的逐行语法不正确?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您的代码有几个问题:

    1. df['required']==number 不太可能工作,因为dfnumber 之间的长度不同。

    2. and 需要一个布尔值。 Pandas 不知道如何转换系列,例如df['used'] == 0 转换为单个布尔值。

    3. 您可以只将不带参数的函数名传递给apply。那是df.apply(missing_value, axis=1),顺便说一下,它会为您提供一列None,因为您不会在函数内返回任何内容。

    话虽如此,在这种情况下你不应该迭代:

    numbers = [20, 35, 75]
    df.loc[df['used'].eq(0) & df['required'].isin(numbers), 'used'] = df['required']
    

    【讨论】:

    • 我什至没有意识到您可以只使用 .loc 来更改值,这是一个更简单的解决方案。非常感谢!
    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 2016-08-04
    • 2021-04-20
    • 1970-01-01
    • 2018-06-07
    • 2021-05-14
    • 1970-01-01
    • 2014-06-23
    相关资源
    最近更新 更多