2017-09-02 6 views
0

私は、コメント(文字列テキスト)に関する情報とコメントが投稿された日付を含むタプルのリストを持っています。たとえば:タプルのリストからdfへのデータfrom

comments[1] 

(datetime.date(2016, 8, 29), 
'I played with these ATM before but they are just too expensive way to buy bitcoins.There were a few in the city I live but many of them already stop operation, most likely because no one actually uses them.') 

私はtopicは1〜40の数であり、タプル(topic, value)のリストを返す機能lda_descriptionを持っており、返されるリストの長さも1および40から例えば次のとおりです。

lda_description(comments[1][1]) 

[(10, 0.43287377217078077), (14, 0.43712141484779793), (21, 0.068338146314754045)] 

問題があります私はlda_descriptionの検索結果をpandasデータフレームにマップし、40列のトピックを持ち、インデックスはdatetimeです。データフレームフィールド値は、特定の日付に各トピックのすべてのコメント 'lda_descriptionの合計である必要があります。

は、私は私の意見では効率的ではなく、多分誰かがで私を助けることができるソリューションを持っているこの:)

#Creating empty dataframe 
df = pd.DataFrame(0, index=pd.date_range(datetime.datetime(2013,12,1), datetime.datetime(2016,11,21)).tolist(), 
        columns=range(1,41)) 
df["count"] = 0 

i = 0 
for com in comments: 

    if i % 50000 == 0: 
     print(datetime.datetime.now(), i) 
    i += 1 

    topic_dist = lda_description(com[1]) 

    for dist in topic_dist: 

     df.set_value(com[0],dist[0], 
        df.ix[com[0]][dist[0]] + dist[1]) 
     df.set_value(com[0],'count', 
        df.ix[com[0]]['count'] + 1) 

答えて

0
私が最初に一緒にあなたのLDAの値を取得し、その後でデータフレームを構築することをお勧め

既に準備されたデータ。たとえば:

# sample data 
import numpy as np 
import pandas as pd 
n = 40 
dates = pd.date_range("2013-12-01", "2016-11-21") 
corpus = np.repeat("foo", len(dates)) 

# toy function, outputs (<topic number>, <topic-membership proba>) tuples 
def lda_description(doc, n): 
    return list(zip(np.arange(n), np.random.random(size=n))) 

# each element of data has the LDA topic-membership probability for n=40 topics 
data = [[lda[1] for lda in lda_description(doc, n)] for doc in corpus] 

は今だけデータフレームを構築:

df = pd.DataFrame(data, index=dates, columns=range(1,n+1)) 

df.head() 
        1   2   3    39  40   
2013-12-01 0.756845 0.741939 0.334812 ... 0.383386 0.687347 
2013-12-02 0.013250 0.143308 0.025458 ... 0.413655 0.581954 
2013-12-03 0.464378 0.889262 0.208653 ... 0.885814 0.685987 
2013-12-04 0.816939 0.613601 0.958807 ... 0.761439 0.758965 
2013-12-05 0.856021 0.191507 0.956722 ... 0.869742 0.543119 

あなたcount列がちょうどでその列を作成し、行のシリアルインデックスを維持するために意図されている場合:

df.assign(count=range(len(dates)))