如何用循环简化Python中多主题DataFrame的创建与合并代码?
简化重复代码:用循环批量生成并合并主题DataFrame
原重复代码示例
# Topic -1 对应的代码 keyword = pd.DataFrame( Q5_model.get_topic(freq.iloc[-1]["Topic"]), columns = ["keyword","c-TF-IDF scores"] ) keyword['Topic'] = Q5_model.get_topic_info().query("Topic == -1")['Name'] keyword['Count'] = Q5_model.get_topic_info().query("Topic == -1")['Count'] keyword['Topic number'] = '-1' # Topic 0 对应的代码 keyword0 = pd.DataFrame( Q5_model.get_topic(freq.iloc[0]["Topic"]), columns = ["keyword","c-TF-IDF scores"] ) keyword0['Topic'] = Q5_model.get_topic_info().query("Topic == 0")['Name'] keyword0['Count'] = Q5_model.get_topic_info().query("Topic == 0")['Count'] keyword0['Topic number'] = '0' keyword_all = keyword.append(keyword0)
注:keyword1至keyword4的代码结构与上述完全一致
初步框架存在的问题
你写的循环框架有几个关键错误:
range(-1,4)仅会遍历-1、0、1、2、3,遗漏了Topic 4,需调整范围query("Topic == x")中的变量x无法被字符串解析,会被当作字面量"x"处理- 循环内直接
append的方式效率低且容易出错,且df(keyword_x)是错误的语法 - 重复调用
Q5_model.get_topic_info()会降低代码运行效率
修正后的循环代码
import pandas as pd # 初始化空列表,用于存储每个主题的DataFrame topic_dataframes = [] # 遍历目标主题:-1、0、1、2、3、4 for topic_num in [-1, 0, 1, 2, 3, 4]: # 根据主题编号获取对应的Topic ID if topic_num == -1: target_topic = freq.iloc[-1]["Topic"] else: target_topic = freq.iloc[topic_num]["Topic"] # 创建关键词DataFrame current_df = pd.DataFrame( Q5_model.get_topic(target_topic), columns=["keyword", "c-TF-IDF scores"] ) # 一次性获取当前主题的信息,避免重复调用接口 topic_detail = Q5_model.get_topic_info().query(f"Topic == {topic_num}").iloc[0] # 补充字段 current_df['Topic'] = topic_detail['Name'] current_df['Count'] = topic_detail['Count'] current_df['Topic number'] = str(topic_num) # 和原代码保持一致,存为字符串类型 # 将当前DataFrame加入列表 topic_dataframes.append(current_df) # 合并所有主题的DataFrame keyword_all = pd.concat(topic_dataframes, ignore_index=True) # 保存到CSV文件 keyword_all.to_csv(SAVE_DIR + 'keyword_all_Q5_model.csv', index=False)
优化说明
- 减少重复调用:一次性获取单主题的详情信息,避免多次调用
get_topic_info() - 高效合并:用
pd.concat替代循环内的append,符合pandas的规范且效率更高 - 索引规范:
ignore_index=True保证合并后DataFrame的索引连续无重复 - 类型统一:
Topic number字段与原代码保持字符串类型,如需数字类型可去掉str()转换
内容的提问来源于stack exchange,提问作者vegetable-salad
相关产品推荐
相关产品推荐

