首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将计数器列表转换为稀疏Pandas DataFrame

将计数器列表转换为稀疏Pandas DataFrame
EN

Stack Overflow用户
提问于 2019-10-30 08:30:25
回答 1查看 288关注 0票数 0

我在构建一个带有稀疏数据类型的熊猫DataFrame时遇到了麻烦。我的输入是一堆存储为字典或计数器的特征向量。对于像文本的词袋表示这样的稀疏数据,将数据存储为密集的文档x术语矩阵通常是不合适和不可行的,并且对于保持数据结构的稀疏性是必要的。

例如,假设输入为:

代码语言:javascript
运行
复制
docs = [{'hello': 1}, {'world': 1, '!': 2}]

输出应等于:

代码语言:javascript
运行
复制
import pandas as pd
out = pd.DataFrame(docs).astype(pd.SparseDtype(float))

而不会在此过程中创建密集阵列。(我们可以检查out.dtypesout.sparse.density。)

尝试1:

代码语言:javascript
运行
复制
out = pd.DataFrame(dtype=pd.SparseDtype(float))
out.loc[0, 'hello'] = 1
out.loc[1, 'world'] = 1
out.loc[1, '!'] = 2

但这会产生密集的数据结构。

尝试2:

代码语言:javascript
运行
复制
out = pd.DataFrame({"hello": pd.SparseArray([]),
                    "world": pd.SparseArray([]),
                    "!": pd.SparseArray([])})
out.loc[0, 'hello'] = 1

但这会引起TypeError: SparseArray does not support item assignment via setitem的注意。

我最终在下面找到的解决方案在我尝试过的Pandas的早期版本中不起作用。

EN

回答 1

Stack Overflow用户

发布于 2019-10-30 08:30:25

这似乎适用于Pandas 0.25.1:

代码语言:javascript
运行
复制
out = pd.DataFrame([[0, 'hello', 1], [1, 'world', 1], [1, '!', 2]],
                   columns=['docid', 'word', 'n'])
out = out.set_index(['docid', 'word'])['n'].astype(pd.SparseDtype(float))
out = out.unstack()

或者更一般地说:

代码语言:javascript
运行
复制
def dicts_to_sparse_dataframe(docs):
    rows = ((i, k, v)
            for i, doc in enumerate(docs)
            for k, v in doc.items())
    out = pd.DataFrame(rows, columns=['docid', 'word', 'n'])
    out = out.set_index(['docid', 'word'])['n'].astype(pd.SparseDtype(float))
    out = out.unstack()
    return out

然后:

代码语言:javascript
运行
复制
>>> docs = [{'hello': 1}, {'world': 1, '!': 2}]
>>> df = dicts_to_sparse_dataframe(docs)
>>> df.sparse.density
0.5

我希望这不会在整个过程中创建密集的内存结构……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58617185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档