python-3.x - 应用高级逻辑来生成新的 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')
有什么想法吗?谢谢!
解决方案
通过和
numpy.select
与测试错误值一起使用:Series.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
推荐阅读
- php - 如何通过它在php中的值删除数组?
- c# - 如何在最大化时停止 SizableToolWindow 进入 Windows 10 任务栏?
- google-sheets - 如何对 regexreplace 找到的每个结果进行 vlookup?
- html - IE 没有加载正确的图像,使用
- python - 如何比较数组的两个索引(不是这些索引的值)?
- r - 如何通过 sapply 替换 for 循环或在从 MySQL 加载空间数据的函数中应用
- hibernate - Jpa fetch 和 n+1 问题
- java - 无头 Chrome - 获取空白页面源
- javascript - 根据两个条件过滤嵌套的json
- c# - 为什么在交换插槽时 Azure 应用服务会重新启动?