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

如何将yfinance批量下载的多只股票数据拆分为单个股票的DataFrame

如何将yfinance批量下载的多只股票数据拆分为单个股票的DataFrame

嗨,我来帮你搞定这个拆分问题!你已经用group_by='Ticker'让批量数据按股票分组了,接下来只需要几步就能把它拆成和单独下载完全一样的DataFrame,还能去掉那些多余的MultiIndex名称。

解决步骤

  1. 提取每个股票的列子集:利用pandas的xs()方法,从MultiIndex列中精准提取单只股票的所有数据。
  2. 清理列索引:去掉列层级的多余名称,让结构和单独下载的DataFrame完全对齐。
  3. 存入字典便于调用:把每只股票的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 OpenMSFT 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

火山引擎 最新活动