当前位置: 首页 > 后端技术 > Python

Pandas进阶教程:稀疏数据结构介绍

时间:2023-03-26 13:17:49 Python

如果数据中有很多NaN值,会浪费存储空间。为了解决这个问题,Pandas引入了一种称为稀疏数据的结构来高效地存储这些NaN值。备用数据示例我们创建一个数组,然后将其大部分数据设置为NaN,然后??使用此数组创建一个SparseArray:In[1]:arr=np.random.randn(10)In[2]:arr[2:-2]=np.nanIn[3]:ts=pd.Series(pd.arrays.SparseArray(arr))In[4]:tsOut[4]:00.4691121-0.2828632NaN3NaN4NaN5NaN6NaN7NaN8-0.8618499-2.104569dtype:Sparse[float64,nan]这里的dtype类型是Sparse[float64,nan],意思是实际上并没有存储数组中的nan,只存储了非nan的数据,这些数据的类型是float64.SparseArrayarrays.SparseArray是一个用于存储稀疏数组类型的ExtensionArray。在[13]中:arr=np.random.randn(10)在[14]中:arr[2:5]=np.nanIn[15]:arr[7:8]=np.nanIn[16]:sparr=pd.arrays.SparseArray(arr)In[17]:sparrOut[17]:[-1.9556635297215477,-1.6588664275960427,nan,nan,nan,1.1589328886422277,0.14529711373305043,nan,0.6060271905134522,1.3342113401317768]Fill:nanIntIndexIndices:array([0,1,5,6,8,9],dtype=int32)使用numpy.asarray()将其转换为普通数组:In[18]:np.asarray(sparr)Out[18]:array([-1.9557,-1.6589,nan,nan,nan,1.1589,0.1453,nan,0.606,1.3342])SparseDtypeSparseDtype表示Spare类型。它包含两种信息,第一种是非NaN值的数据类型,第二种是填充时的常量值,比如nan:In[19]:sparr.dtypeOut[19]:Sparse[float64,nan]可以如下像这样构造一个SparseDtype:In[20]:pd.SparseDtype(np.dtype('datetime64[ns]'))Out[20]:Sparse[datetime64[ns],NaT]你可以指定填充值:在[21]中:pd.SparseDtype(np.dtype('datetime64[ns]'),....:fill_value=pd.Timestamp('2017-01-01'))....:Out[21]:Sparse[datetime64[ns],Timestamp('2017-01-0100:00:00')]可以通过.sparsesparse访问稀疏属性:In[23]:s=pd.Series([0,0,1,2],dtype="Sparse[int]")In[24]:s.sparse.densityOut[24]:0.5In[25]:s.sparse.fill_valueOut[25]:0Sparse的np计算函数可以直接在SparseArray中使用,返回一个SparseArray。在[26]中:arr=pd.arrays.SparseArray([1.,np.nan,np.nan,-2.,np.nan])在[27]中:np.abs(arr)Out[27]:[1.0,nan,nan,2.0,nan]Fill:nanIntIndexIndices:array([0,3],dtype=int32)SparseSeriesandSparseDataFrameSparseSeriesandSparseDataFrame在1.0.0版本被删除。它们的替代品是更强大的SparseArray。看看两者的用法区别:#以前的方式>>>pd.SparseDataFrame({"A":[0,1]})#新的方式In[31]:pd.DataFrame({"A":pd.arrays.SparseArray([0,1])})Out[31]:A0011如果是SciPy中的稀疏矩阵,可以使用DataFrame.sparse.from_spmatrix():#以前的方式>>>fromscipyimportsparse>>>垫=稀疏。眼睛(3)>>>df=pd。SparseDataFrame(mat,columns=['A','B','C'])#NewwayIn[32]:fromscipyimportsparseIn[33]:mat=sparse.eye(3)In[34]:df=pd.DataFrame.sparse.from_spmatrix(mat,columns=['A','B','C'])在[35]中:df.dtypesOut[35]:ASparse[float64,0]BSparse[float64,0]CSparse[float64,0]dtype:object本文已收录于http://www.flydean.com/13-python-pandas-sparse-data/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!