Python列表内DataFrame追加指定DataFrame失败,求问题原因及解决方法
问题原因
append方法不修改原对象:x.append(df_forecast)会返回一个新的DataFrame,而非在原DataFrame上直接修改。你将新对象赋值给循环变量x,但这不会改变df_list里的原始元素,也不会更新df_apples、df_oranges这些初始变量。- 循环变量的作用域限制:在
for x in df_list循环中,x只是列表元素的临时引用,重新赋值x不会影响列表内的原始DataFrame对象。
修复方案
方案1:通过索引遍历更新列表元素
直接操作列表索引,将合并后的新DataFrame重新存入对应位置:
import pandas as pd import numpy as np # 历史数据定义 df_apples = pd.DataFrame({'sales': [400, 450, 500, 545, 550], 'price': [3.00, 2.75, 3.44, 4.00, 5.32], 'date' : ['2022-10-31','2022-11-30','2022-12-31','2023-01-31','2023-02-28']}) df_oranges = pd.DataFrame({'sales': [50, 65, 60, 80, 110], 'price': [0.50, 0.45, 0.30, 0.35, 0.40], 'date' : ['2022-10-31','2022-11-30','2022-12-31','2023-01-31','2023-02-28']}) df_grapes = pd.DataFrame({'sales': [300, 350, 360, 380, 510], 'price': [1.05, 1.10, 1.35, 1.55, 0.95], 'date' : ['2022-10-31','2022-11-30','2022-12-31','2023-01-31','2023-02-28']}) df_list=[df_apples,df_oranges,df_grapes] # 预测数据定义 index = pd.date_range('2023-03-31', periods=6, freq='M') columns = ['sales','price'] df_forecast = pd.DataFrame(index=index, columns=columns) # 修改后的合并逻辑 for i in range(len(df_list)): # 复制原DataFrame避免修改原始数据 temp_df = df_list[i].copy() temp_df.set_index(pd.to_datetime(temp_df['date']), inplace=True) temp_df.drop('date', axis=1, inplace=True) # 用pd.concat替代已弃用的append方法 merged_df = pd.concat([temp_df, df_forecast]) # 更新列表中的元素 df_list[i] = merged_df # 验证合并结果 print(df_list[0])
方案2:直接生成新的合并列表
如果不需要保留原始DataFrame,可直接创建包含合并后数据的新列表:
# 数据定义部分与上述一致 merged_df_list = [] for df in df_list: # 处理日期索引并删除原date列 processed_df = df.set_index(pd.to_datetime(df['date'])).drop('date', axis=1) # 合并历史与预测数据 merged_df = pd.concat([processed_df, df_forecast]) merged_df_list.append(merged_df) # merged_df_list即为所有合并后的DataFrame集合
额外提示
pandas 2.0及以上版本中,DataFrame.append()方法已被弃用,官方推荐使用pd.concat()完成DataFrame合并操作,这也是修复方案中选用concat的原因。
内容的提问来源于stack exchange,提问作者jack homareau
相关产品推荐
相关产品推荐

