我有一个包含股票价值的DataFrame
。
看起来是这样的:
>>>Data Open High Low Close Volume Adj Close Date
2013-07-08 76.91 77.81 76.85 77.04 5106200 77.04
当我尝试使用以下if语句创建条件新列时:
Data['Test'] =Data['Close'] if Data['Close'] > Data['Open'] else Data['Open']
我得到以下错误:
Traceback (most recent call last):
File "<pyshell#116>", line 1, in <module>
Data[1]['Test'] =Data[1]['Close'] if Data[1]['Close'] > Data[1]['Open'] else Data[1]['Open']
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
然后我使用a.all()
:
Data[1]['Test'] =Data[1]['Close'] if all(Data[1]['Close'] > Data[1]['Open']) else Data[1]['Open']
结果是选择了整个['Open']
列。我没有得到我想要的条件,即每次在['Open']
和['Close']
列之间选择最大值。
如有任何帮助,我们将不胜感激。
谢谢。
问题是,您要求python计算一个包含多个布尔值的条件(
Data['Close'] > Data['Open']
)。您不想使用any
或all
,因为这会将Data['Test']
设置为Data['Open']
或Data['Close']
。可能有更干净的方法,但有一种方法是使用掩码(布尔数组):
从如下数据帧:
我能想到的最简单的事情是:
df.ix[:,["Open", "Close"]].max(axis=1)
可能会快一点,但我觉得看起来不太好。或者,可以对行使用
.apply
:或者回到纽比:
基本问题是
if/else
不能很好地处理数组,因为if (something)
总是将something
强制为单个bool
。它不等同于“对于数组中的每个元素,如果条件成立的话”或类似的东西。这是一个where-conditional,意思是给我a的值if a>;B,否则给我B
在这种情况下
max
是等价的相关问题 更多 >
编程相关推荐