合并Pandas DataFrame与Series时append和concat方法报错问题
解决DataFrame无append属性的AttributeError问题
问题背景
编写format_topics_sentences函数用于生成文档主导主题、贡献占比及关键词,调用时触发错误:AttributeError: 'DataFrame' object has no attribute 'append',尝试原append方法和错误的concat用法均未解决。
报错原因
Pandas 2.0及后续版本移除了DataFrame.append()方法,原代码中sent_topics_df.append(...)的写法已不再支持;同时你尝试的sent_topics_df.concat(...)是错误用法——concat是Pandas的顶层工具函数,不是DataFrame的实例方法。
修复方案
方案1:预存数据到列表(推荐,效率更高)
避免在循环中频繁修改DataFrame,先将所有行数据存入列表,最后一次性转换为DataFrame:
修改后的完整代码
import pandas as pd def format_topics_sentences(corpus, texts, ldamodel=None): # 初始化存储每行数据的列表 rows_list = [] # 获取每个文档的主主题 for i, row_list in enumerate(ldamodel[corpus]): row = row_list[0] if ldamodel.per_word_topics else row_list row = sorted(row, key=lambda x: (x[1]), reverse=True) # 提取主导主题、贡献占比和关键词 for j, (topic_num, prop_topic) in enumerate(row): if j == 0: # 仅处理主导主题 wp = ldamodel.show_topic(topic_num) topic_keywords = ", ".join([word for word, prop in wp]) # 将当前行数据添加到列表 rows_list.append({ 'Dominant_Topic': int(topic_num), 'Perc_Contribution': round(prop_topic, 4), 'Topic_Keywords': topic_keywords }) else: break # 从列表转换为DataFrame sent_topics_df = pd.DataFrame(rows_list) # 添加原始文本到结果 contents = pd.Series(texts, name='Original_Text') sent_topics_df = pd.concat([sent_topics_df, contents], axis=1) return sent_topics_df
方案2:用pd.concat替代append(适合小数据量)
如果坚持在循环中逐行拼接,需将新生成的Series转为DataFrame,再用顶层pd.concat函数拼接:
# 替换原append行的代码 new_row = pd.Series([int(topic_num), round(prop_topic,4), topic_keywords], index=['Dominant_Topic', 'Perc_Contribution', 'Topic_Keywords']) sent_topics_df = pd.concat([sent_topics_df, new_row.to_frame().T], ignore_index=True)
调用验证
使用原调用语句即可正常运行:
df_topic_sents_keywords_I1 = format_topics_sentences(ldamodel=lda_model_I1, corpus=corpus_I1, texts=data_ready_I1)
内容的提问来源于stack exchange,提问作者Rohan Vaidya
相关产品推荐
相关产品推荐

