为DataFrame应用多条件mask时触发ValueError如何解决?
问题原因
- 你读取的fits文件经astropy加载后默认返回掩码数组(MaskedArray),转成pandas DataFrame后仍保留了隐式掩码标记,直接使用
&进行多条件布尔运算时,pandas无法对带隐式掩码的数组做逐元素逻辑判断,就会抛出布尔值歧义的错误。 - 虽然你已经给两个条件都加了括号,但是如果你的DataFrame是稀疏存储格式,
&运算符默认会优先做整体布尔判断而非逐元素运算,也会触发该报错。
解决方法
以下3种方案任选一种即可,按兼容性从高到低排序:
- 用numpy的逐元素逻辑运算函数构造掩码,完全规避数组类型兼容和运算符优先级问题:
import numpy as np link = 16.0 mask = np.logical_and(df <= link, df != 0.0) df = df.where(mask, 1.0)
- 加载fits文件时先把掩码数组转成普通数组,掩码位置填充为NaN后再转DataFrame:
from astropy.io import fits import pandas as pd import numpy as np with fits.open('matrix_CEREBELLUM_large.fits') as data: # 掩码位置填充为NaN,消除隐式掩码标记 arr = np.ma.filled(data[0].data, np.nan) df = pd.DataFrame(arr) # 后续多条件运算就可以正常用&运算符了 link = 16.0 mask = (df <= link) & (df != 0.0) df = df.where(mask, 1.0)
- 直接用np.where完成数值替换,绕开DataFrame的where方法的兼容问题:
link = 16.0 df = pd.DataFrame( np.where((df <= link) & (df != 0.0), df, 1.0), columns=df.columns, index=df.index )
内容的提问来源于stack exchange,提问作者8-Bit Borges
相关产品推荐
相关产品推荐

