问题:我想将列表列表转换为数据帧。
设置:我有以下列表:
data = [[(1,0.8),(2,0.2)],
[(0,0.1),(1,0.3),(2,0.6)],
[(0,0.05),(1,0.05),(2,0.3),(3,0.4),(4,0.2)]]
这是来自gensim
的LDA文档主题概率列表,其中每个列表是一个文档,每个元组是五个主题概率之一。 (请参阅我在Stack Overflow上发布的早期问题here)。元组中的第一个元素表示主题编号,第二个元素是文档主题概率的概率。
请注意,虽然某些文档(如第3个列表)最多可包含5个元组(主题概率),但gensim LDA不会输出概率小于0.01的主题的概率。因此,文档1和文档2等示例的元组少于五个。
目标:使用for循环创建文档主题概率矩阵,以便:
ProbMatrix = [(0,0.8,0.2,0,0),
(0.1,0.3,0.6,0,0),
(0.05,0.05,0.3,0.4,0.2)]
如上所述,对于"缺失"需要插入元组(主题),零。一旦我得到这个列表,我想我可以使用pandas dataframe函数来产生我的最终输出(df),这样
df = pd.DataFrame(ProbMatrix)
我的(失败)尝试:
ProbMatrix = []
for i in data: #each document i
for j in i: #each topic j
if j[0] == 0:
ProbMatrix[i,0].append(j[1])
elif j[0] == 1:
ProbMatrix[i,1].append(j[1])
elif j[0] == 2:
ProbMatrix[i,2].append(j[1])
elif j[0] == 3:
ProbMatrix[i,3].append(j[1])
elif j[0] == 4:
ProbMatrix[i,4].append(j[1])
问题是我如何引用ProbMatrix,因为我收到以下错误:
TypeError: list indices must be integers, not tuple
感谢您的帮助!
奖励(也就是说,如果你能提供帮助,情况会更好):
我在gensim LDA中发现的一个问题是,如上所述,即使minimum_probability = None
,它也不会输出小于0.01的概率。例如,请参见前面的post。上面的示例是说明性的,因为每个文档的主题概率总和为1。但是,实际上输出看起来更像是这样:
data = [[(1,0.79),(2,0.2)], # topic 1 probability 0.79 from 0.8
[(0,0.09),(1,0.3),(2,0.6)], # topic 0 probability 0.09 from 0.1
[(0,0.05),(1,0.05),(2,0.3),(3,0.4),(4,0.2)]]
我正在寻找的不是将零置于未知主题概率中,而是使剩余的缺失主题具有均匀概率,使得每个文档的主题概率等于1.例如,这将导致ProbMatrix:
ProbMatrix = [(0.0033,0.79,0.2,0.0033,0.0033),
(0.09,0.3,0.6,0.005,0.005),
(0.05,0.05,0.3,0.4,0.2)]
答案 0 :(得分:1)
我不是100%肯定你在问什么,但我认为这是你想要获得你所展示的probmatrix
列表的目的。你可以这样做
data = [[(1,0.8),(2,0.2)],
[(0,0.1),(1,0.3),(2,0.6)],
[(0,0.05),(1,0.05),(2,0.3),(3,0.4),(4,0.2)]]
probmatrix = []
for i in data:
tmp = [0,0,0,0,0]
for j in i:
tmp[j[0]] = j[1]
probmatrix.append(tmp)
df = pd.DataFrame(probmatrix)
print df
0 1 2 3 4
0 0.00 0.80 0.2 0.0 0.0
1 0.10 0.30 0.6 0.0 0.0
2 0.05 0.05 0.3 0.4 0.2
因为你知道只有五个元素,你可以用5个零初始化tmp列表,只需替换那些非零的
答案 1 :(得分:0)
不确定它是否是您想要的,但i
是一个文档,而您正在使用它来ProbMatrix
。您可以ProbMatrix = {}
而不是ProbMatrix = []
将其用作字典。
答案 2 :(得分:0)
您无法使用[i,j]引用列表列表,在您的情况下,它是元组列表。您应该首先列出清单。 尝试:
ProbMatrix[i].append(j[1]) # add a number to the list at row i
也许我没有理解为什么你需要2个指数。在这种情况下,它应该是:
ProbMatrix[i][j].append(j[1])
答案 3 :(得分:0)
如果您知道所需的输出形状,可以使用np.zeros
创建零填充Numpy数组并相应填充。
import numpy as np
import pandas as pd
probMatrix = np.zeros(shape=(3,5)) # size of (num docs, k topics)
for doc_num, probs in enumerate(data):
for k_index, prob in probs:
probMatrix[doc_num, k_index] = prob
将返回:
array([[ 0. , 0.8 , 0.2 , 0. , 0. ],
[ 0.1 , 0.3 , 0.6 , 0. , 0. ],
[ 0.05, 0.05, 0.3 , 0.4 , 0.2 ]])
如果需要,可以直接加载到pandas数据框中,或者就像它一样非常有用。