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

Polars read_excel读取混合类型列与Pandas结果不一致问题咨询

Polars与Pandas读取混合类型Excel列结果不一致的原因及解决方法

原因分析

  • Pandas读取Excel的混合类型列时,会将该列设为object类型,支持同一列中并存不同基础类型——示例里的mixed列中,1、4是int类型,'6A'是str类型。
  • Polars基于Arrow列存格式,而Arrow是强类型系统,要求同一列的类型必须统一。面对混合类型列,Polars会自动推断为最兼容的string类型,把原本的数字转为字符串('1'、'4')。转成Pandas DataFrame后,这些值仍是字符串类型,和Pandas直接读取的int类型值对比自然不相等。

是否属于Polars/Arrow的限制?

这不是功能限制,而是类型系统的设计差异:

  • Pandas的object列是弱类型设计,允许存储不同的Python对象,灵活性强但性能偏低。
  • Arrow(Polars的底层依赖)采用强类型列存,要求列类型统一,优势是计算效率和内存利用率更高,但对混合类型的处理更严格。

解决方法

要让Polars读取后转成的Pandas DataFrame和Pandas直接读取的结果完全一致,可通过以下方式处理混合类型列:

方法1:读取时指定列为Object类型

用Polars的dtype参数强制指定混合类型列为pl.Object,保留原始的混合类型:

test_pl = pl.read_excel('test.xlsx', dtype={'mixed': pl.Object}).to_pandas()

这样读取后,列中的数字会以整数类型存储,字符串保持原样,和Pandas的读取结果完全匹配。

方法2:读取后手动转换类型

如果读取时未指定类型,可在读取后对混合列做类型转换,将能转为数字的字符串转回整数:

test_pl = pl.read_excel('test.xlsx').with_columns(
    pl.col('mixed').map_elements(
        lambda x: int(x) if str(x).isdigit() else x,
        return_dtype=pl.Object
    )
).to_pandas()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:05:27