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

pd.read_csv读取含重复列名的CSV时如何提取目标Volume列

问题根源

从yfinance导出的带ticker分组的行情数据是多级列索引结构:CSV第一行是标的代码(如M6A=F),第二行是对应的行情字段(Open/High/Low/Close/Volume)。用pandas默认参数读取时,只会把第一行识别为列名,才会出现多个同名M6A=F列被自动重命名、usecols参数只能匹配到第一个同名列的问题。

实现方法

方法1:读取时识别多级表头(无需修改原有CSV文件)

读文件时指定header=[0,1]参数,告诉pandas前两行共同组成列名,读取后会自动保留二级索引结构,直接按索引定位目标列即可,代码如下:

import pandas as pd

# 读取文件,指定前两行为多级表头,第一列为时间索引
df = pd.read_csv(
    './store/historicaldata.csv',
    header=[0, 1],
    index_col=0,
    parse_dates=True
)

# 定位M6A=F对应的Volume列
m6a_volume = df[('M6A=F', 'Volume')]

# 计算总成交量
total_vol = m6a_volume.sum()

参数说明:

  • header=[0,1]:将第0、1行共同作为多级列名,从根源解决重名列问题
  • index_col=0:将第一列的时间数据设为DataFrame索引
  • parse_dates=True:自动将时间字符串转为datetime格式,方便后续时序计算

读取后可以通过打印df.columns验证结构,所有列都是(标的代码, 行情字段)格式的元组,除了Volume外,其他Open/High/Low/Close字段也可以用同样方式提取。

方法2:预存拍平列名的CSV(一劳永逸减少后续读取成本)

如果后续需要频繁读取该文件,可以在首次拉取数据后就把多级列名拍平,存为无重名的CSV文件,后续读取不需要额外指定表头参数:

import pandas as pd
import pandas_datareader.data as pdr

# 拉取行情数据
tickers = ['M6A=F'] # 你的标的列表
historicaldata = pdr.get_data_yahoo(tickers, period='1mo', interval='5m', prepost=True, group_by='ticker')

# 拍平多级列名,生成 标的_字段 格式的唯一列名
historicaldata.columns = [f"{ticker}_{field}" for ticker, field in historicaldata.columns]

# 存为无重名列的CSV
historicaldata.to_csv('./store/historicaldata_flat.csv')

# 后续读取直接取对应列即可,不需要处理多级表头
df = pd.read_csv('./store/historicaldata_flat.csv', index_col=0, parse_dates=True)
m6a_volume = df['M6A=F_Volume']
total_vol = m6a_volume.sum()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:03:21