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

读取CSV文件时如何将Pandas多级列索引转为整数类型?

解决Pandas多级列索引读取后变为字符串的问题

这个问题太常见了——CSV本身是纯文本格式,没办法保留索引的原始数据类型,所以当你把带多级索引的DataFrame存成CSV再读回来时,所有索引层级都会被默认解析成字符串,哪怕原来的是整数。下面给你几种简单有效的解决办法:

方法一:读取后直接转换列索引层级

先把数据读进来,再针对列索引的目标层级做类型转换:

import pandas as pd

# 读取CSV,指定表头和索引列
df_read = pd.read_csv('multi_index_df.csv', header=[0, 1], index_col=[0, 1])

# 把列索引的第二层转换为整数类型
new_col_level2 = df_read.columns.get_level_values(1).astype(int)
df_read.columns = df_read.columns.set_levels(new_col_level2, level=1)

# 验证类型:现在第二层索引是整数了
print(type(df_read.columns.get_level_values(1)[0]))  # 输出 <class 'int'>

方法二:读取时提前处理列名

如果想一步到位,也可以在读取后立刻重构列索引:

df_read = pd.read_csv('multi_index_df.csv', index_col=[0, 1])

# 遍历列名元组,把第二层转成整数
new_columns = [(level1, int(level2)) for level1, level2 in df_read.columns]
# 重新生成多级列索引
df_read.columns = pd.MultiIndex.from_tuples(
    new_columns,
    names=['col_level1', 'col_level2']  # 这里要和原DataFrame的索引名称对应
)

方法三:用rename批量转换层级

如果你的列索引第二层里混合了数字和非数字字符串,可以用rename加判断逻辑来精准转换:

df_read.columns = df_read.columns.rename(
    lambda x: int(x) if isinstance(x, str) and x.isdigit() else x,
    level=1  # 指定要转换的层级
)

为什么会出现这个问题?

本质上是CSV的局限性:它没有数据类型的概念,所有内容都会被存成文本。Pandas在写入CSV时会把整数索引转成字符串,读取时自然也会默认解析为字符串类型,所以必须手动干预转换回原来的类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:23:21