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

如何将yfinance获取的DataFrame中股票代码替换为对应股票名称?

问题描述

我正在使用yfinance获取股票数据,该库采用股票代码(stock tickers)作为标识,但这些代码通常难以直接识别。因此在完成数据下载操作后,我希望通过查找本地列表,将DataFrame中的原始股票代码替换为对应的股票名称。我对字典以及索引/替换的概念较为陌生,能否请各位指点解决方向?

附上相关代码:

import yfinance as yf
import pandas as pd
import csv

tickerCsv = open('Stocks.csv', 'r')
reader = csv.reader(tickerCsv)
next(reader, None)  # skip the headers
tickers = {rows[0] for rows in reader}

data = yf.download(tickers, period='1mo', start="2009-01-01", end="2020-12-31", group_by='ticker')

close_prices = pd.DataFrame()

for ticker in tickers:
    close_prices[ticker] = data[ticker]['Adj Close']
    close_prices[ticker].replace(dict(zip(reader['Symbol'], reader['Name'])))

Stocks.csv文件内容:左侧为股票代码,右侧为需要替换成的对应股票名称。


解决方案

核心思路是先构建股票代码-名称的映射字典,再用这个字典批量替换DataFrame的列名。你的代码存在几个逻辑问题,下面分步修正:

1. 正确读取CSV并构建映射字典

你用csv.reader读完一次后,文件游标会走到末尾,无法再次读取。直接用pandas读取CSV更高效,还能直接生成映射字典:

# 假设CSV有列名:Symbol(股票代码)、Name(股票名称)
ticker_map = pd.read_csv('Stocks.csv', index_col='Symbol')['Name'].to_dict()
# 若CSV无列名,替换成下面两行
# ticker_df = pd.read_csv('Stocks.csv', header=None)
# ticker_map = dict(zip(ticker_df[0], ticker_df[1]))

这样ticker_map就是{股票代码: 股票名称}的字典,是后续替换的核心依据。

2. 修正数据下载逻辑

原代码中period='1mo'和start/end参数冲突,yfinance会优先使用period,导致时间范围不符合预期,需要删除period参数。同时构建收盘价DataFrame可以简化,无需循环:

# 从映射字典中提取股票代码列表
tickers = list(ticker_map.keys())

# 下载指定时间范围的股票数据
data = yf.download(tickers, start="2009-01-01", end="2020-12-31", group_by='ticker')

# 直接提取所有股票的Adj Close列,重组为DataFrame
close_prices = pd.DataFrame({ticker: data[ticker]['Adj Close'] for ticker in tickers})

3. 批量替换列名为股票名称

使用pandas的rename方法,结合映射字典就能一次性替换所有列名:

close_prices = close_prices.rename(columns=ticker_map)

完整修正代码

import yfinance as yf
import pandas as pd

# 读取CSV构建股票代码-名称映射字典
ticker_map = pd.read_csv('Stocks.csv', index_col='Symbol')['Name'].to_dict()
# 若CSV无列名,启用下面两行
# ticker_df = pd.read_csv('Stocks.csv', header=None)
# ticker_map = dict(zip(ticker_df[0], ticker_df[1]))

# 获取股票代码列表
tickers = list(ticker_map.keys())

# 下载指定时间范围的股票数据
data = yf.download(tickers, start="2009-01-01", end="2020-12-31", group_by='ticker')

# 构建收盘价DataFrame
close_prices = pd.DataFrame({ticker: data[ticker]['Adj Close'] for ticker in tickers})

# 替换列名为股票名称
close_prices = close_prices.rename(columns=ticker_map)

# 查看结果
print(close_prices.head())

关键概念说明

  • 映射字典:{key: value}的键值对结构,这里用股票代码做key、名称做value,是快速查找和批量替换的核心工具。
  • DataFrame.rename():pandas专门用于修改列名或行索引的方法,传入字典即可完成批量替换,比循环操作高效得多。
  • 文件读取注意:csv.reader是流式读取,读完一次后游标会停在文件末尾,无法重复读取,用pandas读取CSV能避免这类问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 21:42:36