Pandas过滤DataFrame触发ValueError,请求修复方法
问题:Pandas DataFrame过滤触发ValueError错误
错误的过滤代码
self.symbols_dataframe_stc_stocks = self.symbols_dataframe[(self.symbols_dataframe['categoryName'] == 'STC') and (self.symbols_dataframe['categoryName'] == 'STK') and (self.symbols_dataframe['levarage'] == 100.)] self.symbols_dataframe_cfd_stocks = self.symbols_dataframe[(self.symbols_dataframe['categoryName'] == 'STC') and (self.symbols_dataframe['categoryName'] == 'STK') and (self.symbols_dataframe['levarage'] != 100.)]
DataFrame数据类型
symbol object currency object categoryName object currencyProfit object quoteId int64 quoteIdCross int64 marginMode int64 profitMode int64 pipsPrecision int64 contractSize int64 exemode int64 time int64 expiration object stopsLevel int64 precision int64 swapType int64 stepRuleId int64 type int64 instantMaxVolume int64 groupName object description object longOnly bool trailingEnabled bool marginHedgedStrong bool swapEnable bool percentage float64 bid float64 ask float64 high float64 low float64 lotMin float64 lotMax float64 lotStep float64 tickSize float64 tickValue float64 swapLong float64 swapShort float64 leverage float64 spreadRaw float64 spreadTable float64 starting object swap_rollover3days int64 marginMaintenance int64 marginHedged int64 initialMargin int64 shortSelling bool timeString object currencyPair bool dtype: object
报错信息
Traceback (most recent call last): File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\threading.py", line 973, in _bootstrap_inner self.run() File "C:\Users\...\AppData\Local\Programs\Python\Python39\lib\threading.py", line 910, in run self._target(*self._args, **self._kwargs) File "C:\Users\...\PycharmProjects\LSTM_multiple_indicators\UI.py", line 353, in getAllSymbols_xtb_api self.symbols_dataframe_stc_stocks = self.symbols_dataframe[(self.symbols_dataframe['categoryName'] == 'STC') and (self.symbols_dataframe['categoryName'] == 'STK') and (self.symbols_dataframe['levarage'] == 100.)] File "C:\Users\...\PycharmProjects\LSTM_multiple_indicators\venv\lib\site-packages\pandas\core\generic.py", line 1527, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
问题分析与修复
核心问题点
- 逻辑运算符错误:Pandas处理Series布尔索引时,不能用Python原生的
and/or,必须用元素级的&(与)/|(或),且每个条件需用括号包裹,避免运算优先级冲突。 - 条件逻辑矛盾:
categoryName == 'STC'和categoryName == 'STK'不可能同时成立,应该筛选categoryName为两者之一的记录,需用isin方法或|运算符。 - 拼写错误:代码中
levarage是拼写错误,DataFrame实际列名为leverage。
修复后的代码
# 筛选categoryName为STC或STK,且leverage等于100的记录 self.symbols_dataframe_stc_stocks = self.symbols_dataframe[ (self.symbols_dataframe['categoryName'].isin(['STC', 'STK'])) & (self.symbols_dataframe['leverage'] == 100.) ] # 筛选categoryName为STC或STK,且leverage不等于100的记录 self.symbols_dataframe_cfd_stocks = self.symbols_dataframe[ (self.symbols_dataframe['categoryName'].isin(['STC', 'STK'])) & (self.symbols_dataframe['leverage'] != 100.) ]
补充说明
- 使用
isin(['STC', 'STK'])比(categoryName == 'STC') | (categoryName == 'STK')更简洁,尤其当可选值较多时。 - 对浮点列做相等判断时,建议考虑精度问题,比如用
abs(leverage - 100.) < 1e-6替代直接==,避免因浮点精度导致匹配失败。
内容的提问来源于stack exchange,提问作者Jakub Szurlej
相关产品推荐
相关产品推荐

