You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas将循环的每次迭代结果保存到单个CSV文件中

解决CSV被覆盖问题:批量收集基金数据后统一保存

这个问题很常见——你现在每次循环里直接调用to_csv,默认是覆盖模式,所以最后只有最后一只基金的数据被保留。我们可以先把所有基金的单条数据收集起来,循环结束后再统一写入CSV,这样就能得到你想要的合并格式了。

优化后的完整代码

import requests
import pandas as pd

urls = ['https://markets.ft.com/data/funds/tearsheet/historical?s=LU0526609390:EUR', 
        'https://markets.ft.com/data/funds/tearsheet/historical?s=IE00BHBX0Z19:EUR', 
        'https://markets.ft.com/data/funds/tearsheet/historical?s=LU1076093779:EUR']

def format_date(date):
    date = date.split(',')[-2][1:] + date.split(',')[-1]
    return pd.Series({'Date': date})

# 初始化空列表,用来存储所有基金的DataFrame
all_fund_data = []

for url in urls:
    ISIN = url.split('=')[-1].replace(':', '_')
    ISIN = ISIN[:-4] + ".OTHER"
    
    html = requests.get(url).content
    df_list = pd.read_html(html)
    df = df_list[-1]
    
    df['Date'] = df['Date'].apply(format_date)
    # 批量删除不需要的列,比多次del更简洁
    df = df.drop(columns=['Open', 'High', 'Low', 'Volume'])
    df = df.rename(columns={'Close': 'last_traded_price', 'Date': 'last_traded_on'})
    df.insert(2, "id", ISIN)
    # 只取最新的一行数据
    df = df.head(1)
    
    # 将当前基金的DataFrame添加到列表中
    all_fund_data.append(df)

# 循环结束后,合并所有DataFrame
combined_df = pd.concat(all_fund_data, ignore_index=True)
# 一次性写入CSV,不会覆盖
combined_df.to_csv(r'/Users/.../Testdata.csv', index=False)
# 打印合并后的结果
print(combined_df)

关键改动说明

  1. 收集数据到列表:用all_fund_data = []创建空列表,每次循环处理完单只基金的数据后,用append把df加入列表,避免每次写入CSV。
  2. 合并DataFrame:循环结束后用pd.concat()把列表里的所有小df合并成一个大的DataFrame,ignore_index=True可以重置行索引,避免索引重复。
  3. 统一写入CSV:最后只调用一次to_csv,把合并后的完整数据写入文件,这样就不会出现覆盖问题了。

额外小优化

  • 用df.drop(columns=[...])批量删除多列,比多次del代码更整洁。
  • 简化了ISIN的拼接逻辑,把三次赋值合并成一行,可读性更好。

内容的提问来源于stack exchange,提问作者Tcs106

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 18:37:31