【问题标题】:Creating a new column with logical operators使用逻辑运算符创建新列
【发布时间】:2020-05-09 07:51:40
【问题描述】:

我正在尝试创建一个新列,该列将分配“五或更多”、“减五或更少”、“五与减五之间”,并将另一列作为其输入:

df['Change']
Out[196]: 
0       -0.398010
1       -3.980227
2        1.475952
3        0.000000
4       -2.043446

31514         NaN
31515         NaN
31516         NaN
31517         NaN
31518         NaN
Name: Change, Length: 30811, dtype: float64

我试过了:

df['new_column'] = df.apply(lambda x: 'Five Or More' if (df['Change'] >= 5) else 'Between Five And Minus Five')
df['new_column'] = df.apply(lambda x: 'Minus Five Or Less' if (df['Change'] <= 5) else 'Between Five And Minus Five')

对于这两个我都收到此错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

感谢任何提供帮助的人!

【问题讨论】:

    标签: python pandas apply add


    【解决方案1】:

    试试这个

    df['new_column'] = df["Change"].apply(lambda x: 'Five Or More' if (x>= 5) else 'Between Five And Minus Five')
    df['new_column'] = df["Change"].apply(lambda x: 'Minus Five Or Less' if (x <= -5) else 'Between Five And Minus Five')
    

    【讨论】:

    • 好的,现在 lambda 函数运行良好,但它们似乎相互覆盖,现在应该有“负五或更少”的行实际上有“五到负五之间”
    • 第二个条件应该是x&lt;= -5 而不是x&lt;= 5
    • 能够通过 lambda 函数内的 2 个条件完成它:df['new_column'] = df['Change'].apply(lambda x: 'ABOVE 5' if x &gt;= 5 else 'BELOW -5' if x &lt;= -5 else 'BETWEEN 5 AND -5')
    【解决方案2】:

    改成这个来修复你的 lambda 函数?

    df['new_column'] = df['Change'].apply(lambda x: 'Five Or More' if (x >= 5) else 'Between Five And Minus Five')
    

    在您的 lambda 函数中,如果您设置了 lambda x,则需要使用 x,并且应用需要在列上 - 而不是 df 本身。查看更多信息https://datatofish.com/if-condition-in-pandas-dataframe/

    另一种方法是根据您的条件创建一个函数并将此函数应用于您的数据框,如下所示:

    def conditions(x):
        if(x>=5):
            return 'Five or More'
        elif(x<=-5):
            return 'Minus Five or Less'
        else:
            return 'Between Five And Minus Five'
    
    df['new_column'] = df['Change'].apply(conditions)
    
    

    【讨论】:

    • 好的,现在 lambda 函数运行良好,但它们似乎相互覆盖,现在应该有“负五或更少”的行实际上有“五到负五之间”
    • 所以我认为你需要做的是用你所有的 if 和 else 做一个函数,然后应用那个单一的函数,因为 lambdas 不能很好地处理我所拥有的多个 if 和 else见过。我会尝试更新我的答案
    • 我实际上刚刚了解到可以在 lambda 函数中使用 2 个或更多条件,这解决了:df['new_column'] = df['Change'].apply(lambda x: 'ABOVE 5' if x &gt;= 5 else 'BELOW -5' if x &lt;= -5 else 'BETWEEN 5 AND -5')
    • 当我认为你的意思是 x 时,你的代码也说 x
    • 好酷!我也发布了另一种方法。在 lambda 中使用过多条件的一个缺点是,如果您有很多条件可能难以跟踪,我建议您在条件函数上使用 apply 以获得更好的可读性。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签