我有一个类型为 SparseDataFrame
而我想改变一些值。
通常在处理数据框时,我会使用 DataFrame.loc
, DataFrame.iloc
或 set_value
. 当试图将此方法用在一个 SparseDataFrame
对象,我总是得到一个错误,如下所示。
"SparseArray does not support item assignment via setitem"
TypeError: SparseArray does not support item assignment via setitem
我如何正确使用SparseArray?
这个问题。设置列的百分比为0(pandas) 建议先用 df.to_dense()
,做作业,然后用 df.to_sparse()
我想知道是否有一种方法可以直接用它来转换。SparseDataFrame
SparseArray
?
不能用.loc[]直接以稀疏格式插入是令人沮丧的。恐怕我只有 变通办法.
自从最初发布问题(和0.25版本)后,pandas已经废弃了SparseDataFrame。取而代之的是,它创建了一种数据类型(SparseDtype),可以应用于DataFrame中的单个序列。换句话说,它不再是 "全有或全无"。你可以
这显然是 比将整个DataFrame转换为密集的.
这里有一个非常简单的函数来说明我的意思。
def sp_loc(df, index, columns, val):
""" Insert data in a DataFrame with SparseDtype format
Only applicable for pandas version > 0.25
Args
----
df : DataFrame with series formatted with pd.SparseDtype
index: str, or list, or slice object
Same as one would use as first argument of .loc[]
columns: str, list, or slice
Same one would normally use as second argument of .loc[]
val: insert values
Returns
-------
df: DataFrame
Modified DataFrame
"""
# Save the original sparse format for reuse later
spdtypes = df.dtypes[columns]
# Convert concerned Series to dense format
df[columns] = df[columns].sparse.to_dense()
# Do a normal insertion with .loc[]
df.loc[index, columns] = val
# Back to the original sparse format
df[columns] = df[columns].astype(spdtypes)
return df
简单的使用例子:
# DÉFINITION DATAFRAME SPARSE
df1 = pd.DataFrame(index=['a', 'b', 'c'], columns=['I', 'J'])
df1.loc['a', 'J'] = 0.42
df1 = df1.astype(pd.SparseDtype(float))
# | I | J
# ----+-----+--------
# a | nan | 0.42
# b | nan | nan
# c | nan | nan
df1.dtypes
#I Sparse[float64, nan]
#J Sparse[float64, nan]
df1.sparse.density
# 0.16666666666666666
# INSERTION
df1 = sp_loc(df1, ['a','b'], 'I', [-1, 1])
# | I | J
# ----+-----+--------
# a | -1 | 0.42
# b | 1 | nan
# c | nan | nan
df1.sparse.density()
# 0.5