python - 将列表列表转换为dataframe

时间:2015-11-04 15:05:26

标签: python list pandas dataframe gensim

问题:我想将列表列表转换为数据帧。

设置:我有以下列表:

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)]

4 个答案:

答案 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数据框中,或者就像它一样非常有用。