python - 使用 .loc 和 OR 运算符返回 ValueError
问题描述
我正在尝试在两列中的任何一列中搜索特定值,当找到目标值时,将第三列中的数字从正数更改为负数或从负数更改为正数。
te1 = df.loc[df['Transaction Event'] == 'Exercise']
te2 = df.loc[df['Transaction Event'] == 'Assignment']
te3 = df.loc[df['Transaction Event'] == 'Expiration']
an1 = df.loc[df['Action'] == 'Delete']
nq = df['Net Quantity']
var1 = df[(df['Transaction Event'] == 'Exercise') | (df['Transaction Event'] == 'Assignment') | (df['Transaction Event'] == 'Expiration') | (df['Action'] == 'Delete')]
df.loc[df[var1], nq] = df.loc[df[var1], nq] * -1
运行此代码会返回以下错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-282-01dbb8066276> in <module>()
6 var1 = df[(df['Transaction Event'] == 'Exercise') | (df['Transaction Event'] == 'Assignment') | (df['Transaction Event'] == 'Expiration') | (df['Action'] == 'Delete')]
7
----> 8 df.loc[df[var1], nq] = df.loc[df[var1], nq] * -1
9 print(df)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key)
1958 return self._getitem_array(key)
1959 elif isinstance(key, DataFrame):
-> 1960 return self._getitem_frame(key)
1961 elif is_mi_columns:
1962 return self._getitem_multilevel(key)
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py in _getitem_frame(self, key)
2034 if key.values.size and not is_bool_dtype(key.values):
2035 raise ValueError('Must pass DataFrame with boolean values only')
-> 2036 return self.where(key)
2037
2038 def query(self, expr, inplace=False, **kwargs):
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in where(self, cond, other, inplace, axis, level, try_cast, raise_on_error)
5338 other = com._apply_if_callable(other, self)
5339 return self._where(cond, other, inplace, axis, level, try_cast,
-> 5340 raise_on_error)
5341
5342 @Appender(_shared_docs['where'] % dict(_shared_doc_kwargs, cond="False",
C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\generic.py in _where(self, cond, other, inplace, axis, level, try_cast, raise_on_error)
5096 for dt in cond.dtypes:
5097 if not is_bool_dtype(dt):
-> 5098 raise ValueError(msg.format(dtype=dt))
5099
5100 cond = cond.astype(bool, copy=False)
ValueError: Boolean array expected for the condition, not float64
有谁知道是什么导致了这个错误?
解决方案
您不是在创建掩码,而是在df
执行此操作时选择了掩码的一个子集:
var1 = df[(df['Transaction Event'] == 'Exercise') | (df['Transaction Event'] == 'Assignment') | (df['Transaction Event'] == 'Expiration') | (df['Action'] == 'Delete')]
相反,您只需要这个:
var1 = (df['Transaction Event'] == 'Exercise') | (df['Transaction Event'] == 'Assignment') | (df['Transaction Event'] == 'Expiration') | (df['Action'] == 'Delete')
在您当前的代码中,您创建所需的布尔数组,但还df
使用该数组另外索引到您的原始数组。var1
您可以确认您是否查看了当前代码中实际包含的内容。
推荐阅读
- cakephp - 如何在 cakephp3.6 中返回带有原始 html 数据的电子邮件模板?
- python - 在 colab 中使用 keras_to_tpu_model 时,TPU 运行速度与 CPU 一样慢
- c# - 如何正确使用旧的 asp 站点 url 重定向到 MVC 路由?
- image - 电脑上的顶部页眉图像以及手机和平板电脑上的中心
- c++ - 用鼠标单击 OpenGL 拖动 3d 对象
- excel - .Formula 运行时错误 1004 在某些机器上而不是其他机器上
- javascript - 注入 Javascript 函数在 Android React Native WebView 中不起作用,但在 iOS React Native 中工作正常
- python - 提取tar文件中文件夹的内容
- html - Bootstrap NavBar 汉堡菜单在移动设备上不起作用
- graphql - 卡在构建 gatsby-starter-netlify-cms