【问题标题】:CountVectorizer alternative with Counter objectsCountVectorizer 与 Counter 对象的替代方案
【发布时间】:2020-01-21 18:52:48
【问题描述】:

我有一个相当大的 DataFrame(几千行),包含两列:一个 ID 和一个与 ID 关联的标签的 Counter 对象。计数器计算项目与该特定标签关联的次数。

每个项目可能有不同的标签,标签的总数也在数千个左右。

例子:

df = pd.DataFrame([[1, Counter({'a': 4, 'b': 2})],
                   [2, Counter({'b': 1, 'c': 3})],
                   [3, Counter({'a': 3, 'c': 5, 'd': 1})]],
                  columns=['ID', 'count'])

我的目标是获取标签计数矩阵,类似于我在文本上使用 CountVectorizer() 时得到的结果。

我有限的知识导致我编写了这段代码:

# Create empty list
list = []

# iterate trough DataFrame
for item in df.itertuples():

    table = pd.DataFrame.from_dict(item.count, orient='index').reset_index()
    table.columns = ['tag', item.ID]
    list.append(table)

tag_table = pd.concat(list, sort=False)

但是,它并没有真正起作用。

嗯,它可能会工作,但它仍在处理中,因为 append 和 concat 非常慢。

如何更有效地解决问题?

谢谢!

【问题讨论】:

  • 你能提供一个Minimal, reproductible example吗?两三行 Dateframe 就足够了,它使您的问题更容易理解。另外,您希望使用此 Dataframe 实现的主要目标是什么?
  • @chefhose 感谢您的反馈,我添加了一个可重现的最小示例。我的最终目标是聚集相似的标签以减少它们的数量。
  • 数千行非常小。尝试一个简单的 python 循环。我很好奇你是如何让自己陷入一列计数器的情况,如果你先使用源代码,你可能会做一些更有效率的事情。
  • @PascalVKooten 来源是 id - 标签对的 DataFrame,我使用 df.groupby('ID') ,然后循环构建当前 DataFrame。我不是很了解,所以我对任何其他选择持开放态度

标签: python pandas dataframe counter


【解决方案1】:

你可以使用DictVectorizer:

import pandas as pd
from sklearn.feature_extraction import DictVectorizer

df = pd.DataFrame([[1, Counter({'a': 4, 'b': 2})],
                   [2, Counter({'b': 1, 'c': 3})],
                   [3, Counter({'a': 3, 'c': 5, 'd': 1})]],
                  columns=['ID', 'count'])

dv = DictVectorizer()

dv.fit_transform(df["count"]).toarray()
# array([[4., 2., 0., 0.],
#        [0., 1., 3., 0.],
#        [3., 0., 5., 1.]])

【讨论】:

  • 谢谢,这工作完美无缺。我相信 .toarray() 部分只是为了使其可打印,对吗?
  • @GarrettCode 是的,确实,它只是为了向您展示结果,但您不想使用它,因为稀疏表示对内存的成本更低。
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 2011-03-28
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多