首页 > 解决方案 > Pandas .at 不工作并且数据框没有改变

问题描述

有大量DataFrame文本,我想首先对其进行训练和 LDA 模型。所以我这样做:

doc_clean = df['tweet_tokenized'].tolist()
dictionary = corpora.Dictionary(doc_clean)
doc_term_matrix = [dictionary.doc2bow(doc) for doc in doc_clean]
lda = LdaMulticore(doc_term_matrix, id2word=dictionary, num_topics=50)

现在我已经训练好了lda,我想df逐行迭代 throw 并将每一行属于给定主题的概率放到其对应的列中。所以,首先我创建 50 列零:

for i in range(50):
    col_name = 'tweet_topic_'+str(i)
    df[col_name] = 0

然后我使用以下方法遍历行iterrows()并更新值at

for row_index, row in df.iterrows():
    new_doc = dictionary.doc2bow(row['tweet_tokenized'])
    lda_result = lda[new_doc]
    for topic in lda_result:
        col_name = 'tweet_topic_'+(str(topic[0]))
        df.at[row_index,col_name] = topic[1]

但它不能正常工作,上述 50 列的值不会改变并保持为零。

知道我应该如何解决这个问题吗?

更新:我添加row = row.copy()并替换atloc,现在效果很好。

所以这里是工作代码:

for row_index, row in df.iterrows():
    row = row.copy()
    new_doc = dictionary.doc2bow(row['tweet_tokenized'])
    lda_result = lda[new_doc]
    for topic in lda_result:
        col_name = 'tweet_topic_'+(str(topic[0]))
        df.loc[row_index,col_name] = topic[1]

标签: pythonpandas

解决方案


使用以下帖子中的说明,我能够解决它:

为熊猫更新 iterrow 中的值

for row_index, row in df.iterrows():
    row = row.copy()
    new_doc = dictionary.doc2bow(row['tweet_tokenized'])
    lda_result = lda[new_doc]
    for topic in lda_result:
        col_name = 'tweet_topic_'+(str(topic[0]))
        df.loc[row_index,col_name] = topic[1]

推荐阅读