首页 > 解决方案 > 应用高级逻辑来生成新的 pandas 数据框

问题描述

在 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.xpandaslambdaapply

解决方案


通过和 numpy.select与测试错误值一起使用:Series.isnaSeries.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

推荐阅读