循环遍历DataFrame列表丢失首个数据,如何合并所有数据集?
解决循环中合并DataFrame时首个元素异常的问题
我来帮你搞定这个循环处理DataFrame时的头疼问题!先直接揪出问题根源:你用的 dps = pd.DataFrame(dps.append(results)) 写法有两个致命问题:
- Python列表的
append()是原地修改操作,它的返回值是None。第一次循环时dps是空列表,dps.append(results)返回None,转成DataFrame自然就是空的,这就是首个元素处理异常的核心原因。 - 就算后续
dps变成了DataFrame,pandas的append()方法已经被官方标记为弃用,而且每次赋值覆盖的方式既低效又容易引发逻辑错误。
下面给你两种靠谱的解决思路:
方法一:先收集所有处理结果,最后一次性合并(推荐)
这种方法更高效也更稳妥,先把每个循环里处理好的DataFrame存进列表,循环结束后用pd.concat()一次性合并成大表:
import quandl import pandas as pd dfd = quandl.get("FRED/DEXBZUS") dfe = quandl.get("ECB/EURBRL") df_list = [dfd, dfe] processed_dfs = [] # 用来暂存每个处理后的DataFrame for df in df_list: df1 = df.reset_index() results = pd.DataFrame(df1) results = results.rename(columns={'Date': 'ds','Value': 'y'}) processed_dfs.append(results) # 将处理好的结果加入列表 # 最后合并所有DataFrame,重置索引避免重复 dps = pd.concat(processed_dfs, ignore_index=True) print(dps)
方法二:逐步合并(适合大数据量分批处理场景)
如果不想一次性存储所有数据,想边循环边合并,那要初始化dps为空DataFrame,每次用pd.concat()来合并:
import quandl import pandas as pd dfd = quandl.get("FRED/DEXBZUS") dfe = quandl.get("ECB/EURBRL") df_list = [dfd, dfe] dps = pd.DataFrame() # 初始化为空DataFrame for df in df_list: df1 = df.reset_index() results = pd.DataFrame(df1) results = results.rename(columns={'Date': 'ds','Value': 'y'}) # 用pd.concat合并当前结果与已有DataFrame dps = pd.concat([dps, results], ignore_index=True) print(dps)
再唠唠为啥原来的写法不行
- 第一次循环时,空列表调用
append()返回None,转成DataFrame就变成了空表,直接覆盖了初始的空列表,后续循环都基于这个空表操作,自然出问题。 - pandas的
append()已经被弃用,官方明确推荐用pd.concat()替代,它的功能更灵活,处理多表合并也更稳定。
这样修改后,不管你循环里有1个还是N个DataFrame,都能正确合并成单个完整的DataFrame啦!
内容的提问来源于stack exchange,提问作者Cesar




