我的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是系列,因此出现此错误:
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)
关于python - 如何从pandas数据框中的bool和float列计算新的向量化列?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26779801/