我正在试验UCI Bag of Words Dataset。我将文档id、单词(word id)和单词计数读取到三个单独的列表中。这些列表的前10项类似于下面的内容:
['1', '1', '1', '1', '1', '2', '2', '2', '3', '3'] #docIDs
['118', '285', '129', '168', '20', '529', '6941', '7', '890', '285'] #wordIDs
['1', '1', '1', '1', '2', '1', '1', '5', '1', '1'] #count
我不知道如何从这些列表中制作术语文档矩阵,没有任何冗余。我想将行转换为docid,将列转换为wordid,并将相应的单元格值转换为单词计数。用python (pandas)做这个的有效方法是什么?
我想这回答了你的问题:
列表:
docid = ['1', '1', '1', '1', '1', '2', '2', '2', '3', '3'] #docIDs
wordid = ['118', '285', '129', '168', '20', '529', '6941', '7', '890', '285'] #wordIDs
counted = ['1', '1', '1', '1', '2', '1', '1', '5', '1', '1'] #count
DataFrame,每个列表在一个单独的列中:
df = pd.DataFrame([docid, wordid, counted],
index = ["docIDs", "wordIDs", "count"]).T
Pivot this for index为" docid "列为"wordIDs"值为"count"
df = df.pivot(index="docIDs", columns="wordIDs", values="count")
输出:
#wordIDs 118 129 168 20 285 529 6941 7 890
#docIDs
#1 1 1 1 2 1 NaN NaN NaN NaN
#2 NaN NaN NaN NaN NaN 1 1 5 NaN
#3 NaN NaN NaN NaN 1 NaN NaN NaN 1
或者,您可以通过设置所需的索引和列作为索引来使用unstack()
,然后解除这些列的堆叠:
df.set_index(["docIDs", "wordIDs"])["count"].unstack("wordIDs")
产生相同的结果。这会使用更少的内存。