我的DataFrame混合使用float和boolean:
df = pd.DataFrame.from_csv("C:\....")
df['isActive'] = (df.turns >= 250) & (df.alivePct > 0) & (df.changePct > 0)
我想创建一个新列,如果isActive == false,则该值= 0,否则该值等于一些计算出的量,如下所示:
df['interestingness'] = (df.changePct * df.alivePct) if df.isActive else 0
但是,由于df.isActive是一个Series,因此出现此错误:
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
似乎三元if / else运算符不能用于向量化操作中。
手动迭代又如何做呢?
(注意:df.isActive是一个简单的技巧,它将df.isActive的值设置为0,即False ==0。但是,我想知道一个更通用的解决方案。)
您可以使用np.where:
import numpy as np
df['interestingness'] = np.where(df.isActive, df.changePct * df.alivePct, 0)
对于一维数组,np.where(condition, A, B)
是矢量化的等效于
np.array([a if c else b for a,b,c in zip(condition, A, B)])
熊猫还提供了一个Series.where方法,您可以使用:
df['interestingness'] = (df.changePct * df.alivePct).where(df.isActive, 0)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句