【发布时间】: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