我的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/

10-11 21:08