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

pandas read_excel读取Excel时如何禁止数值列名转为float类型

问题根源

pd.read_excel默认会自动推断表头的数据类型,纯数字内容的列名会被识别为数值类型,且会被转成float格式。后续调用列名的.str系列字符串方法时,非字符串类型的列名对应位置会返回NaN,对NaN做~取反操作就会抛出TypeError: bad operand type for unary ~: 'float'错误。

可用方案

两种方案均适配列名无固定规则的场景,按需选择即可:

方案1:读取后统一转换列名类型(兼容性最好,适配绝大多数场景)

读取完成后第一时间把所有列名强制转为字符串,可按需处理float转字符串带来的.0后缀,保证和Excel原始列名一致。

import pandas as pd

df = pd.read_excel(bytes(filedata), engine='openpyxl')
# 列名全转字符串,同时移除纯数字列名被误转float产生的.0后缀
df.columns = [
    str(col)[:-2] if str(col).endswith('.0') and str(col)[:-2].isdigit() 
    else str(col) 
    for col in df.columns
]

# 后续过滤Unnamed列的逻辑可正常执行
df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

如果不需要严格对齐原始列名格式,可直接用更简洁的写法,仅解决报错问题:

df.columns = df.columns.astype(str)

注意这种写法下纯数字列名会变成2839238.0格式的字符串,后续做列名匹配时要统一格式。

方案2:读取阶段关闭自动类型推断,从源头避免列名转数值

读取时不自动识别表头,所有内容按字符串类型读入后手动设置列名,完全避开pandas的表头类型自动推断逻辑:

import pandas as pd

# 不自动识别表头,所有单元格按字符串读取,禁止自动转数值
df = pd.read_excel(bytes(filedata), engine='openpyxl', header=None, dtype=str)
# 提取第一行作为列名
df.columns = df.iloc[0].tolist()
# 移除已作为列名的第一行数据,重置索引
df = df.iloc[1:].reset_index(drop=True)

# 后续列名处理逻辑可正常执行
df = df.loc[:, ~df.columns.str.contains('^Unnamed')]

该方案能保证列名和Excel内的原始文本完全一致,不会出现.0后缀问题;如果文件存在合并单元格、多级表头,需要自行调整表头提取的逻辑。

注意点
  • 由于列名无固定规则,不要尝试只针对特定列设置类型,全量处理列名类型是最稳妥的方案
  • 如果后续需要做跨表列名匹配,务必保证所有表的列名格式统一,避免因为类型或.0后缀导致匹配失败

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:57:17