在Python中导入MultiIndex CSV文件的多级表头处理问题
解决MultiIndex CSV导入时的Unnamed表头问题
我完全懂你的困扰——1000多列手动定义表头根本不现实,咱们直接用pandas的原生功能自动化搞定这个问题。核心思路是自动补全第一级表头的空白值,不用手动干预每一列。
下面给你两种可行的解决方案,选你觉得顺手的就行:
方案一:读取后快速修复表头
这种方式最简洁,先正常读取文件,再用ffill()(向前填充)补全第一级的空白表头:
import pandas as pd # 读取带两级表头的CSV CMF = pd.read_csv("./ConstantMaturityFutures_2.csv", header=[0, 1]) # 补全第一级表头的空白值:把Unnamed的部分替换成前一个非空的第一级表头 CMF.columns = CMF.columns.set_levels(CMF.columns.get_level_values(0).ffill(), level=0) # 把Date列的第二级表头改成空字符串(和你原来的rename操作效果一致) cmf_cols = CMF.columns.to_list() for i, (l0, l1) in enumerate(cmf_cols): if l0 == "Date": cmf_cols[i] = (l0, "") CMF.columns = pd.MultiIndex.from_tuples(cmf_cols) # 处理日期索引 CMF["Date"] = pd.to_datetime(CMF["Date"]) CMF.set_index("Date", inplace=True) CMF.head()
方案二:先预处理表头再读取数据
如果你想更直观地控制表头生成过程,可以先单独读取表头行,处理后再读取完整数据:
import pandas as pd # 先读取前两行表头数据 header_df = pd.read_csv("./ConstantMaturityFutures_2.csv", nrows=2) # 提取第一级表头,用向前填充补全空白 level0 = header_df.iloc[0].ffill().tolist() # 提取第二级表头,把Date列的第二级设为空 level1 = header_df.iloc[1].tolist() level1[level0.index("Date")] = "" # 创建完整的MultiIndex列名 multi_columns = pd.MultiIndex.from_arrays([level0, level1]) # 读取数据,跳过前两行表头,用我们处理好的MultiIndex作为列名 CMF = pd.read_csv("./ConstantMaturityFutures_2.csv", header=None, skiprows=2, names=multi_columns) # 处理日期索引 CMF["Date"] = pd.to_datetime(CMF["Date"]) CMF.set_index("Date", inplace=True) CMF.head()
为什么这两种方法有效?
你的CSV里第一级表头的空白会被pandas识别为Unnamed: x_level_0,用ffill()可以自动把这些空白填充为最近的非空第一级表头,完美适配你有大量列的场景,完全不用手动定义每一列的名称。
内容的提问来源于stack exchange,提问作者Ben




