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

