You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

在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

火山引擎 最新活动