能否直接用numpy布尔矩阵对pandas DataFrame做掩码赋空值?
直接使用二维numpy布尔数组对DataFrame做元素级掩码可以使用以下几种方法,均无需将布尔矩阵转换为DataFrame:
方法1:使用DataFrame.where()(推荐,不修改原对象)
where方法的逻辑是条件为True时保留原值,条件为False时替换为指定值,默认替换值为NaN,直接传入numpy布尔数组即可:
import pandas as pd import numpy as np df = pd.DataFrame(np.arange(9).reshape((3,3)), index=['a','b','c']) b = np.ones((3,3), dtype=bool) b[1,1] = False result = df.where(b)
输出结果:
0 1 2 a 0.0 1.0 2.0 b 3.0 NaN 5.0 c 6.0 7.0 8.0
方法2:使用DataFrame.mask()
mask是where的反向实现,逻辑为条件为True时替换值,传入取反后的布尔数组即可得到和上面完全一致的结果:
result = df.mask(~b)
方法3:直接赋值修改原对象
如果不需要保留原DataFrame的数据,可直接通过布尔索引赋值为空值:
df[~b] = np.nan
之前直接执行df[b]得到异常输出的原因:pandas 1.3.1版本中,直接将二维布尔数组传入方括号索引时,会先将布尔数组扁平化后匹配行索引,因此会生成重复的多行结果,不属于元素级掩码的正确用法。
内容的提问来源于stack exchange,提问作者matsuo_basho
相关产品推荐
相关产品推荐

