Python 带fillna的稀疏数据帧密度问题

Python 带fillna的稀疏数据帧密度问题,python,pandas,sparse-matrix,Python,Pandas,Sparse Matrix,我正在尝试在pandas中创建一个稀疏的数据帧。我通过创建初始数据帧 df = pd.read_sql(sql=sql, con=db_eng, index_col=index) idx = pd.MultiIndex.from_product([df.index.levels[0], df.index.levels[1]], names=df.index.names) my_df = df.reindex(idx) 然后使用以下方法使其稀疏 s1 = my_df.to_sparse() s

我正在尝试在pandas中创建一个稀疏的数据帧。我通过创建初始数据帧

df =  pd.read_sql(sql=sql, con=db_eng, index_col=index)
idx = pd.MultiIndex.from_product([df.index.levels[0], df.index.levels[1]], names=df.index.names)
my_df = df.reindex(idx)
然后使用以下方法使其稀疏

s1 = my_df.to_sparse()
s2 = my_df.to_sparse(fill_value=0)
s2 = my_df.to_sparse().fillna(value=0)
当我检查
s1、s2、s3的密度时,我得到了不同的值:

>>> s1.density
0.054158277796754875
>>> s2.density
1.0
>>> s3.density
0.054158277796754875

为什么第二种方法的密度为1?

我无法访问您的数据,但看起来您的“空”值是
NaN
,因此当基于0值(即
s2
)使其稀疏时,稀疏数据帧一点也不稀疏

这将返回您期望的结果:

s2 = my_df.fillna(0).to_sparse(fill_value=0)
现在,您的“空”值是0,因此使用
fill\u value=0调用
以使数据帧稀疏


编辑:换句话说,
到_sparse
将根据
填充值
使数据帧稀疏,默认值为
NaN

如果在填充了
NaN
值的数据帧上,使用
fill\u value=0
调用
to\u sparse
,则生成的数据帧根本不是稀疏的(密度=
1.0
),它充满了
NaN


你应该读一下介绍:。

我不知道这是否有道理
s2
s3
都用0填充NAN,但
s3
仍然稀疏。还有,如果
to_sparse
方法将稀疏转换为稠密,为什么还要在该方法中使用fill选项?使用
s3
将其变为稀疏,然后使用0填充,因此它是稀疏的。使用
s2
无法使其稀疏,因为您查找的是0而不是
NaN
s。从技术上讲,最终结果是一样的,但一个是稀疏的,另一个不是。如果有帮助的话,我已经在我的答案中添加了解释。那么“空”值在填充后仍然是空的(在某种意义上)?有趣。谢谢我同意,对我来说,
s3
的行为是最出人意料的!这一定是稀疏数据帧的
fillna
方法的一些巧妙的幕后技巧。