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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 02:09:13