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

