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
相关产品推荐
相关产品推荐

