Pandas按GICS拆分DataFrame后循环导出csv内容全部相同问题求解
问题核心原因
- 你在拆分数据集的循环里,没有操作当前分组对应的
dataset,反而每次都调用全量数据集data生成long_dataset,该变量最终只会保留全量数据,导致后续所有宽表转换都基于全量数据,输出文件内容完全一致。 - 你没有初始化存储最终宽表的字典,每次循环直接覆盖
final_datasets变量,最终只会保留最后一个板块的处理结果。
修复方案
直接合并拆分、去列、转宽表的逻辑,不需要额外写拆分的循环,同时初始化字典存储所有处理后的板块数据集:
import pandas as pd import yfinance as yf import numpy as np # 原有数据下载逻辑保持不变 source=pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies') df = pd.DataFrame(source[0]) tickers_symbols=df['Symbol'].values.tolist() GICS_sectors = df['GICS Sector'].values.tolist() data = pd.DataFrame() for t,s in zip(tickers_symbols, GICS_sectors): tmp = yf.download(t, period='1y', progress=False) tmp.reset_index(inplace=True) tmp['Ticker'] = t tmp['GICS'] = s # append方法已被pandas弃用,替换为concat避免版本兼容报错 data = pd.concat([data, tmp], ignore_index=True) ##KEEP ONLY OPENING PRICE## data=data.drop(["Close", "High", "Low", "Adj Close", "Volume"], axis=1) # 初始化存储最终处理结果的字典 final_datasets = {} ## 按GICS分组处理 for sector, dataset in data.groupby('GICS'): # 直接处理当前分组的数据集 wide_df = dataset.drop(columns='GICS', axis=1).pivot_table(index="Date", columns="Ticker", values="Open") # 存入字典,后续可通过final_datasets['GICS板块名']调用对应数据集 final_datasets[sector] = wide_df # 保存为csv文件 wide_df.to_csv(f'{sector} DataFrame.csv', index=True, sep=',')
补充说明
不需要提前把groupby结果转成字典再遍历,直接对data.groupby('GICS')遍历即可,可减少不必要的内存占用。
内容的提问来源于stack exchange,提问作者Ernest East
相关产品推荐
相关产品推荐

