如何在不更改格式的情况下从稀疏数据框中删除行

How to drop rows from a Sparse Dataframe without changing the format

我试图在我的数据框中删除一些空行。下面的代码表明数据类型确实是稀疏的。

items_users_sparse_top_tags_df = items_users_sparse_pd.loc[tracks_tags_df.index]
items_users_sparse_top_tags_df.rename_axis('tracks', axis = 'index', inplace = True)
items_users_sparse_top_tags_df.dtypes

结果:

playlists
37i9dQZF1DX7KNKjOK0o75    Sparse[int64, 0]
37i9dQZF1DWT1y71ZcMPe5    Sparse[int64, 0]
37i9dQZF1DX1tyCD9QhIWF    Sparse[int64, 0]
37i9dQZF1DWSXBu5naYCM9    Sparse[int64, 0]
3JwPVKISB9IBlE2RST1MVn    Sparse[int64, 0]
                                      
0lDMDuxqUYRAHAg2aSB4Mh    Sparse[int64, 0]
6JX1W7EUwl28ApynqRIzGd    Sparse[int64, 0]
73pA7uClVdMP4UM4NHYkjw    Sparse[int64, 0]
7rRuBmh62FSsGh7ymtIUl3    Sparse[int64, 0]
2moEpTGsu9XpWjc7DMCgH6    Sparse[int64, 0]
Length: 3990, dtype: object

当我尝试删除空用户(转置后的行)时,dtype 正在更改。 代码:

users_items_sparse_dropped = items_users_sparse_top_tags_df.T[(items_users_sparse_top_tags_df !=0).any()]

数据类型:

tracks
2res3Ptlahsu1kh5XtFhu4    object
4UGxnxGlpc7BB8Cbu8vITC    object
63diy8Bzm0pHMAU37By2Nh    object
6wBHYoPsAqS88OwfjCvlaq    object
1aoaegj0Bv8p1N6dWyCDbr    object
                           ...  
2IH4PRZxA3W6sIWcFU0GKZ    object
2JKlf0IYz5oWsT3OCLyjpO    object
0fa2P8krhE1K19MUUh0meb    object
2CM7CAL7aJ5WkPU0oGbA96    object
0w2U0uERbUTJMNIKdTSUkj    object
Length: 15679, dtype: object

虽然代码确实删除了空的 users-as-rows,但我更愿意保持数据帧稀疏,这样我就不必再次转换它。

使用稀疏数据帧而不是直接使用 scipy 稀疏格式的原因是将 ID 保持为索引,而不是在数据操作等过程中弄乱。

回答我自己的问题,问题是非空值的 int64 和空值的 nan 之间的兼容性,因为 nan 值被认为是浮点数。

当我转置矩阵时,数据类型从 Sparse[int64, 0] 变为 dtype:O。

有一些解决方法 1)使用 astype 将数据帧转换为浮动。 2)如果有人真的想保留稀疏的 int64 格式,需要使用以下方法创建一个新的稀疏数据类型: pd.SparseDtype(int, fill_value = np.nan) 然后在数据帧操作后使用 astyp 进行转换。

最后,据我尝试,类似的限制适用于 numpy 稀疏格式。

P.S。一个有趣的发现:https://pandas.pydata.org/pandas-docs/stable/user_guide/integer_na.html