Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从数据帧中的bool和float列计算新的矢量化列?_Python_Pandas_Dataframe_Ternary Operator - Fatal编程技术网

Python 如何从数据帧中的bool和float列计算新的矢量化列?

Python 如何从数据帧中的bool和float列计算新的矢量化列?,python,pandas,dataframe,ternary-operator,Python,Pandas,Dataframe,Ternary Operator,我的数据帧混合了浮点和布尔值: 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.alivePc

我的数据帧混合了浮点和布尔值:

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将值设置为0,即False==0。但是我想知道一个更通用的解决方案。)

您可以使用:

对于一维数组,
np。其中(条件,A,B)
是一个向量化等价于

np.array([a if c else b for a,b,c in zip(condition, A, B)])

Pandas还提供了一种您可以使用的方法:

df['interestingness'] = (df.changePct * df.alivePct).where(df.isActive, 0)

一个不同的解决方案,可能不那么可读,但很有效

创建新列/系列:

>>> df
   0      1  2
0  1   True  9
1  2  False  9
2  3   True  9
3  4  False  9
4  5   True  9
>>> df[3] = 0
戴上面具

>>> mask = df[1]
>>> df[3][mask] = (df[0] * df[2])[mask]
>>> df
   0      1  2   3
0  1   True  9   9
1  2  False  9   0
2  3   True  9  27
3  4  False  9   0
4  5   True  9  45
>>> 

你说的更一般是什么意思?还有,为什么它是黑客?它并没有比乘法更一般,也没有比乘法更简单…还有,我的意思是,我看到你的担心像“如果布尔不是0和1呢?”但我会想,是的,把它们转换成0和1,然后再回到乘法。
np.where
解决方案也很好。
>>> mask = df[1]
>>> df[3][mask] = (df[0] * df[2])[mask]
>>> df
   0      1  2   3
0  1   True  9   9
1  2  False  9   0
2  3   True  9  27
3  4  False  9   0
4  5   True  9  45
>>>