【问题标题】:apply an advanced logics to generate a new pandas dataframe应用高级逻辑生成新的 pandas 数据框
【发布时间】:2020-03-30 05:33:56
【问题描述】:

在 Python 3 pandas 数据框中,

a,b
100000,NaN
100000,NaN
100000,NaN
100000,500
10000,5000

我想根据以下逻辑生成一个新的C列:

def applyFunc(a,b):

    if a >= 25000 & b is not null:
        return b*0.3
    elif a >= 25000 & b is null:
        return a*0.3
    else:
        return 0

注意 a & b 列是浮点数,但可以为空。

理想输出:

a,b,c
100000,NaN,30000
100000,NaN,30000
100000,NaN,30000
100000,50000,15000
10000,5000,0

我尝试了以下方法:

df['c']=df.apply(lambda x:applyFunc(df['a'],df['b']), axis=1)

错误:

TypeError: ('cannot compare a dtyped [float64] array with a scalar of type [bool]', 'occurred at index 0')

有什么想法吗?谢谢!

【问题讨论】:

    标签: python-3.x pandas lambda apply


    【解决方案1】:

    使用numpy.selectSeries.isna 测试错误值和 Series.notna:

    m1 = (df.a >= 25000) & (df.b.notna())
    m2 = (df.a >= 25000) & (df.b.isna())
    
    df['c'] = np.select([m1, m2], [df.b*0.3, df.a*0.3], default=0)
    print (df)
            a       b        c
    0  100000     NaN  30000.0
    1  100000     NaN  30000.0
    2  100000     NaN  30000.0
    3  100000   500.0    150.0
    4   10000  5000.0      0.0
    

    【讨论】:

    • 感谢您的精彩回答! @jezrael!
    【解决方案2】:

    代码中的错误:

    a >= 25000 & b is not null

    您使用按位连词 & 而不是布尔连词 and,因此会出现类型错误。

    这应该可行:

    a >= 25000 and b is not null 
    

    【讨论】:

    • null 无论如何都不能被 Python 识别,是吗?
    • null 没有特殊值;您可以创建一个名为null 的对象并随意使用它。作者的意思一定是None
    • 是的,这就是我的意思,使用None 听起来更合适
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 1970-01-01
    • 2021-06-13
    • 1970-01-01
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    相关资源
    最近更新 更多