对Pandas稀疏布尔类型取反,如何保持填充值为False?
稀疏布尔DataFrame取反格式问题及解决
问题描述
我有如下形式的稀疏DataFrame:
df = [[True, False , False], [False, False, True], [False, True, False]]
每列的数据类型为Sparse[bool, False]。需要对其进行取反操作(True→False,False→True),同时保持每列的数据类型仍为Sparse[bool, False]。但使用~运算符取反后,值虽反转,但数据类型变为Sparse[bool, True],求解决方法。
更新说明:尝试将两个矩阵拼接后,发现得到的稀疏矩阵内存占用与密集矩阵相同,因此没必要全程保持稀疏格式。
解决方案
保持稀疏格式的处理方法
如果一定要维持Sparse[bool, False]的格式,可以手动重新构造稀疏数组:
import pandas as pd # 对原DataFrame逐列处理,重新指定填充值为False df_result = df.apply( lambda col: pd.arrays.SparseArray( ~col.to_numpy(), # 取反原数组的值 fill_value=False # 设置新的填充值为False ) )
原理:原稀疏数组以False为填充值,存储的是True的位置;取反后我们需要以False为填充值,存储原False位置的取反结果(即True),通过重新指定fill_value并传入取反后的数组,就能得到符合要求的稀疏格式。
放弃稀疏格式的简化处理
根据更新说明,稀疏矩阵内存优势已不存在,直接转为密集矩阵处理更高效:
# 转换为密集布尔矩阵 df_dense = df.sparse.to_dense() # 直接取反 df_inverted = ~df_dense
后续操作直接基于密集矩阵即可,无需再维护稀疏格式。
内容的提问来源于stack exchange,提问作者bachts
相关产品推荐
相关产品推荐

