gpt4 book ai didi

python - 在 Pandas 中给SparseArray赋值吗?

转载 作者:行者123 更新时间:2023-12-03 17:20:22 33 4
gpt4 key购买 nike

我有一个SparseDataFrame类型的对象,我想更改一些值。
通常在使用数据框时,我使用DataFrame.locDataFrame.ilocset_value。当尝试在SparseDataFrame对象上使用此方法时,总是出现以下错误:

"SparseArray does not support item assignment via setitem"
TypeError: SparseArray does not support item assignment via setitem
如何正确使用SparseArray?
这个问题: Set percentage of column to 0 (pandas)建议首先使用 df.to_dense(),进行分配,然后使用 df.to_sparse()将其转换回去。
我想知道是否可以直接使用 SparseDataFrame/ SparseArray吗?

最佳答案

无法使用.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

    关于python - 在 Pandas 中给SparseArray赋值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032856/

    33 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com