Pandas read_csv读取重复列名CSV仅返回首列的问题解决
解决CSV重复表头下加载指定所有目标列的问题
问题根源
你的CSV是两行复合表头:第一行是标的名称(全为M6A=F),第二行是数据类型(Open/High/Low/Close/Volume)。直接用单表头读取时,pandas会把重复列名合并/覆盖,导致usecols只能匹配到第一个重复列。
解决方案:通过列索引预筛选加载
要在加载前过滤且保留所有目标列,核心思路是先读取表头行,找出所有属于目标标的的列的索引,再通过索引指定usecols加载数据,同时正确识别复合表头。
步骤1:预读取表头行,获取目标列索引
先读取CSV的第一行,处理空格后得到列名列表,筛选出所有等于目标symbol的列的索引:
import pandas as pd symbol = 'M6A=F' # 只读第一行表头 header_row = pd.read_csv('myOHCLVdata.csv', nrows=0).columns # 处理列名中的空格,匹配目标symbol target_indices = [i for i, col in enumerate(header_row.str.strip()) if col == symbol]
步骤2:通过索引加载目标列,识别复合表头
用usecols指定目标列的索引,同时设置header=[0,1]让pandas识别两行表头,避免重复列名被覆盖:
# 加载指定索引的列,同时读取两行作为多级表头 df = pd.read_csv( 'myOHCLVdata.csv', skipinitialspace=True, usecols=target_indices, header=[0, 1] # 第一行和第二行作为多级表头 )
步骤3:转换为FastAPI可用格式
多级表头可以合并为类似M6A=F_Open的单级列名,方便JSON序列化:
import json def parse_csv(df): # 合并多级表头 df.columns = ['_'.join(col).strip() for col in df.columns.values] res = df.to_json(orient="records") parsed = json.loads(res) return parsed # FastAPI接口部分 from fastapi import FastAPI app = FastAPI() @app.get("/test") def historic(): return parse_csv(df)
对之前尝试的补充说明
mangle_dupe_cols=True未生效:因为默认只读取一行表头,重复列名会被重命名,但你的实际表头是两行,必须指定header=[0,1]才能让pandas正确识别结构。usecols用列名匹配只能拿到第一列:pandas在单表头模式下,重复列名会被视为同一列,所以只会保留第一个匹配项,用索引匹配则能精准定位所有目标列。
内容的提问来源于stack exchange,提问作者mdkb
相关产品推荐
相关产品推荐

