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

如何用Pandas读取多行表头CSV(单行含重复)并实现查询与插值?

解决CSV双表头(单行列重复、组合唯一)的Pandas读取与查询/插值需求

1. 正确读取CSV,生成多级列索引

直接通过pd.read_csv的参数配置,把前两行设为多级列索引(MultiIndex),同时指定第一列为行索引,完全规避Pandas自动修改重复表头的问题:

import pandas as pd
from datetime import datetime

# 读取CSV:header=[0,1]指定前两行作为列的两级索引,index_col=0把第一列设为行索引
df = pd.read_csv('your_target.csv', header=[0, 1], index_col=0)

# 将第一级表头(日期字符串)转换为datetime.date类型
df.columns = pd.MultiIndex.from_tuples(
    [(datetime.strptime(date_str, '%Y-%m-%d').date(), sub_col) 
     for date_str, sub_col in df.columns]
)

注:如果你的日期格式不是YYYY-MM-DD,调整strptime的格式参数即可。

2. 三元组(行索引、日期、二级表头)精准查询

利用多级列索引的特性,直接用.loc实现精准定位:

# 示例:查询(280, 2023-09-22, B)
target_date = datetime(2023, 9, 22).date()
result = df.loc[280, (target_date, 'B')]
print(result)  # 输出10

# 查询(280, 2023-09-22, A)
result_a = df.loc[280, (target_date, 'A')]
print(result_a)  # 输出3

如果你的行索引是字符串类型,把280替换为对应的字符串值即可。

3. 目标日期的插值实现

针对目标日期在现有日期区间内的场景,按二级表头分组做插值:

# 提取所有已存在的日期并排序
existing_dates = sorted(df.columns.get_level_values(0).unique())
# 转换为datetime类型(插值依赖时间序列)
existing_dt = pd.to_datetime(existing_dates)

# 假设要插值的目标日期
target_interp_date = datetime(2023, 9, 23).date()
target_interp_dt = pd.to_datetime(target_interp_date)

# 遍历每个二级表头分组,分别插值
for sub_col in df.columns.get_level_values(1).unique():
    # 提取当前分组的所有列,转置为以日期为索引的Series
    temp_df = df.xs(sub_col, level=1, axis=1).T
    temp_df.index = pd.to_datetime(temp_df.index)
    
    # 执行插值(这里用线性插值,可根据需求修改method参数,比如'pad')
    interpolated = temp_df.reindex(existing_dt.append(pd.Index([target_interp_dt]))).interpolate(method='linear')
    
    # 将插值结果新增到原DataFrame中
    df[(target_interp_date, sub_col)] = interpolated.loc[target_interp_dt].values

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 09:45:56