如何从两个稀疏格式DataFrame生成无冗余零值的COO矩阵
解决稀疏DataFrame拼接后转COO矩阵出现零值的问题
问题原因
核心问题出在fillna(0)的误用:你的稀疏DataFrame采用pd.SparseDtype("float", 0),已经将缺失值默认视为填充值0,这类属于「隐式零」,不会占用实际存储空间。但fillna(0)会强制把这些隐式零转换成「显式零」,直接写入稀疏数组的存储列表(sp_values),最终导致COO矩阵的data属性出现多余零值。
解决方案
不需要调用fillna(0),直接对拼接后的稀疏DataFrame执行sparse.to_coo()即可。pandas在拼接稀疏DataFrame时会自动对齐索引和列,缺失位置会保持稀疏类型的隐式零,不会被显式存储。
修正后的代码
import pandas as pd import numpy as np A = pd.DataFrame(np.eye(3), index=['a','b','c'], columns=['a','b','c']).astype(pd.SparseDtype("float", 0)) B = pd.DataFrame(np.random.normal(size=(2,2)), index=['d','e'], columns=['a','b'], ).astype(pd.SparseDtype("float", 0)) # 直接拼接,无需fillna(0) c = pd.concat([A, B], axis=0) # 转换为COO矩阵 coo_matrix = c.sparse.to_coo() # 验证data中无零值 print(all(coo_matrix.data != 0)) # 输出True
补充说明
拼接后,像B没有的列c,pandas会自动为B的行填充隐式零,这些值不会被存储到稀疏数组中。你可以通过c.sparse.sp_values查看实际存储的非零值,确认没有多余的零占用空间。
内容的提问来源于stack exchange,提问作者mfastudillo
相关产品推荐
相关产品推荐

