如何使用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)
关键改动说明
- 收集数据到列表:用
all_fund_data = []创建空列表,每次循环处理完单只基金的数据后,用append把df加入列表,避免每次写入CSV。 - 合并DataFrame:循环结束后用
pd.concat()把列表里的所有小df合并成一个大的DataFrame,ignore_index=True可以重置行索引,避免索引重复。 - 统一写入CSV:最后只调用一次
to_csv,把合并后的完整数据写入文件,这样就不会出现覆盖问题了。
额外小优化
- 用
df.drop(columns=[...])批量删除多列,比多次del代码更整洁。 - 简化了ISIN的拼接逻辑,把三次赋值合并成一行,可读性更好。
内容的提问来源于stack exchange,提问作者Tcs106
相关产品推荐
相关产品推荐

