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

