Python 带fillna的稀疏数据帧密度问题
我正在尝试在pandas中创建一个稀疏的数据帧。我通过创建初始数据帧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
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
方法的一些巧妙的幕后技巧。