DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]
Posted
技术标签:
【中文标题】DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]【英文标题】:DataFrame column comparison raises ValueError: The truth value of a Series is ambiguous. [duplicate] 【发布时间】:2017-12-22 07:53:54 【问题描述】:我正在尝试比较两列以查看一个值是否大于另一列,但我不断收到 ValueError:
ValueError:Series 的真值不明确。使用 a.empty, a.bool()、a.item()、a.any() 或 a.all()
这是引发错误的部分:
if (cleanedData['Roll Price (Spread)'] > cleanedData['Delta VWAP']):
cleanedData["Result"] = "Long"
else:
cleanedData["Result"] = "Short"
我该如何解决这个问题?
【问题讨论】:
"if (cleanedData['Roll Price (Spread)'] > cleanedData['Delta VWAP'])
你不能这样做。这个比较返回一个布尔数组,而不是一个布尔值。"什么?也许如果他在cleanedData['Delta VWAP']
后面加逗号
【参考方案1】:
重现此错误的方法如下:
df = pd.DataFrame('Roll Price': np.random.randint(1, 10, 10),
'Delta VWAP': np.random.randint(1, 10, 10))
df
Out:
Delta VWAP Roll Price
0 7 6
1 9 1
2 9 4
3 2 4
4 7 8
5 8 4
6 8 6
7 9 3
8 2 5
9 6 8
if df['Roll Price'] > df['Delta VWAP']:
df['Result'] = 'Long'
Traceback (most recent call last):
File "<ipython-input-18-a07b1f06bd42>", line 1, in <module>
if df['Roll Price'] > df['Delta VWAP']:
File "/home/ayhan/anaconda3/lib/python3.5/site-packages/pandas/core/generic.py", line 955, in __nonzero__
.format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
错误源于这个比较:df['Roll Price'] > df['Delta VWAP']
如果你执行这个
df['Roll Price'] > df['Delta VWAP']
Out:
0 False
1 False
2 False
3 True
4 True
5 False
6 False
7 False
8 True
9 True
dtype: bool
您会看到结果不是单个 True
或 False
值,而是一个布尔数组。而模棱两可的部分是
Long
?
当数组中的任何值为 True 时,是否要将列设置为 Long
?
事实证明,两者都不是。您想进行逐元素比较,并在满足条件时将对应的值设置为Long
,否则设置为Short
。
为此,您可以使用np.where
:
cond = df['Roll Price'] > df['Delta VWAP']
df['Result'] = np.where(cond, 'Long', 'Short')
df
Out:
Delta VWAP Roll Price Result
0 7 6 Short
1 9 1 Short
2 9 4 Short
3 2 4 Long
4 7 8 Long
5 8 4 Short
6 8 6 Short
7 9 3 Short
8 2 5 Long
9 6 8 Long
【讨论】:
以上是关于DataFrame 列比较引发 ValueError:Series 的真值不明确。 [复制]的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用dataframe中的两列时间对象数据列作差生成时间差数据列将时间差(timedelta对象)与特定时间长度进行比较
如何使用Scala的DataFrame比较表中的每一列而不关心列是啥? [重复]
PySpark向现有DataFrame添加列 - TypeError:无效参数,不是字符串或列
pandas比较两个dataframe特定数据列的数值是否相同并给出差值:使用np.where函数
pandas 比较引发 TypeError:无法将 dtyped [float64] 数组与 [bool] 类型的标量进行比较