如何将yfinance批量下载的多只股票数据拆分为单个股票的DataFrame
如何将yfinance批量下载的多只股票数据拆分为单个股票的DataFrame
嗨,我来帮你搞定这个拆分问题!你已经用group_by='Ticker'让批量数据按股票分组了,接下来只需要几步就能把它拆成和单独下载完全一样的DataFrame,还能去掉那些多余的MultiIndex名称。
解决步骤
- 提取每个股票的列子集:利用pandas的
xs()方法,从MultiIndex列中精准提取单只股票的所有数据。 - 清理列索引:去掉列层级的多余名称,让结构和单独下载的DataFrame完全对齐。
- 存入字典便于调用:把每只股票的DataFrame按代码作为键存入字典,方便后续使用。
完整代码示例
在你现有代码的基础上,添加这段拆分逻辑:
import yfinance as yf import pandas as pd # 你的原有批量下载代码 tickers = ['AAPL', 'MSFT', 'NVDA'] multiple_df = yf.download(tickers, period='2y', interval='1d', group_by='Ticker', multi_level_index=False) # 开始拆分操作 separated_df = {} # 获取所有唯一的股票代码 unique_tickers = multiple_df.columns.get_level_values(0).unique() for ticker in unique_tickers: # 提取当前股票的所有数据列 ticker_df = multiple_df.xs(ticker, axis=1, level=0) # 移除列索引的多余名称(比如你提到的'Price') ticker_df.columns.name = None # 将处理好的DataFrame存入字典 separated_df[ticker] = ticker_df # 测试:打印MSFT的数据,结构和单独下载完全一致 print(separated_df['MSFT'])
为什么这样有效?
xs()方法可以直接从MultiIndex的列中提取指定层级的子集,不用手动筛选列名,既高效又不容易出错。- 设置
ticker_df.columns.name = None正好解决了你头疼的多余MultiIndex名称问题,让列结构和单独调用yf.download('MSFT')得到的结果完全匹配。
额外适配方案
如果你的yfinance版本导致列结构是平铺格式(比如列名是NVDA Open、MSFT Close这种带前缀的),可以用下面的方式拆分:
separated_df = {} for ticker in tickers: # 筛选所有以当前股票代码开头的列 ticker_cols = [col for col in multiple_df.columns if col.startswith(f"{ticker} ")] ticker_df = multiple_df[ticker_cols] # 重命名列,去掉股票代码前缀 ticker_df.columns = [col.split(' ')[1] for col in ticker_df.columns] separated_df[ticker] = ticker_df
备注:内容来源于stack exchange,提问作者Ryanc88




