在Pandas中给SparseArray赋值?

问题描述 投票:7回答:1

我有一个类型为 SparseDataFrame 而我想改变一些值。

通常在处理数据框时,我会使用 DataFrame.loc, DataFrame.ilocset_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?

python pandas sparse-matrix
1个回答
2
投票

不能用.loc[]直接以稀疏格式插入是令人沮丧的。恐怕我只有 变通办法.

自从最初发布问题(和0.25版本)后,pandas已经废弃了SparseDataFrame。取而代之的是,它创建了一种数据类型(SparseDtype),可以应用于DataFrame中的单个序列。换句话说,它不再是 "全有或全无"。你可以

  • 将DataFrame中的一些列转换为密集格式,同时保持其他列的稀疏。
  • 用.loc[]在密列中插入你的数据。
  • 然后再将这些列转换成稀疏的。

这显然是 比将整个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
© www.soinside.com 2019 - 2024. All rights reserved.