我的数据(MALLET 主题模型的文档主题输出)具有以下形状:

0   000cbac90fcc47efad081a929d74ab4c    0   0.3571185904395461  19  0.3113396339935042  4   0.12325835735304397 10  0.10409710001928904 8   0.04929547912982593 1   0.026833654459159112    2   0.01605333272832067 6   0.0048677134975701405   11  0.0019476615596546681   17  0.001908921062167065    14  0.0016877826048433426   5   5.256520178505095E-4    12  2.6155079718746636E-4   15  2.1354275518902175E-4   16  1.4885824861864537E-4   18  1.0362646846573807E-4   3   9.802082006786611E-5    9   9.641623707017035E-5    13  9.348016118039801E-5    7   5.0625647445916464E-5   
1   002d2e8fbf8f40399fb52c12fe6d79a1    2   0.4893657941273363  19  0.31683989601254264 5   0.14250187050440621 4   0.020578111489117222    8   0.012792452390528172    10  0.012232805681991418    11  9.110846196785881E-4    17  8.170410538631972E-4    12  6.349213666458032E-4    15  5.18380595356186E-4 0   4.750799583739948E-4    6   3.65757686209981E-4 16  3.613572723378424E-4    14  2.8022169390809563E-4   1   2.5184798205700335E-4   18  2.5155594892638147E-4   3   2.3794809156182638E-4   9   2.3405292457801712E-4   13  2.2692552394855585E-4   7   1.228950766326711E-4    
2   0046e05d3731491da4d9bab51d6ea36a    16  0.652945776661391   8   0.07953971245258269 0   0.06617734607073089 19  0.059407148715209045    4   0.02302855863782211 5   0.019674895033989195    11  0.014047819199510685    17  0.01259778154009113 2   0.012346407436534609    10  0.012058449719318621    12  0.009789716972385079    15  0.0079927997057698  6   0.005639539660456337    14  0.004320678460350115    1   0.0038831902561877263   18  0.0038786874597068794   3   0.0036688708127993316   9   0.003608812064842682    13  0.0034989161965088794   7   0.001894892943813293    
etc...

每行(代表一个文档)都有一个索引列、一个 id 列和另外 40 个代表当前 20 个主题的列。

我想要得到的形状是每个主题编号都是它自己的列,行只包含索引、id 和主题比例,例如:

i   id                                  0                   1                   2
0   000cbac90fcc47efad081a929d74ab4c    0.3571185904395461  0.2346339935042     0.1884010001928904
etc...

似乎这可以通过枢轴来完成,但是主题编号无序(按行中的相关性排序)使​​得这令人头疼......

如何实现这一目标?

有帮助吗?

解决方案

因此,一种方法是使用 python 切片运算符来获取行中的所有其他值,并将它们(连同文件名)压缩成 3 元组,例如:

data = []
malletOutput = open('doc-topics','r').readlines()

for line in malletOutput:
    line = line.split('\t')[1:-1] # slicing out useless leading index and trailing \n
    _id = line[0]

    tIndicies = map(int,line[1::2])
    tVals = map(float, line[2::2])
    topics = sorted(zip(tIndicies, tVals))
    topics = [t + tuple([_id]) for t in topics] # add _id
    for t in topics:
        data.append(t)

现在您有了一个三元组列表,您可以将其添加到数据框中。从那里进行一个简单的旋转就会得到所需的形状:

df = pd.DataFrame(data)
df = df.pivot(index=2,columns=0,values=1)
许可以下: CC-BY-SA归因
scroll top