You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

循环遍历DataFrame列表丢失首个数据,如何合并所有数据集?

解决循环中合并DataFrame时首个元素异常的问题

我来帮你搞定这个循环处理DataFrame时的头疼问题!先直接揪出问题根源:你用的 dps = pd.DataFrame(dps.append(results)) 写法有两个致命问题:

  1. Python列表的append()原地修改操作,它的返回值是None。第一次循环时dps是空列表,dps.append(results)返回None,转成DataFrame自然就是空的,这就是首个元素处理异常的核心原因。
  2. 就算后续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

火山引擎 最新活动