Polars是否不区分元组与列表?转元组是否无意义?
Polars中列表与元组的处理差异及
.map_elements(tuple)的作用分析 一、Polars对列表与元组的统一处理逻辑
Polars的类型系统中不单独区分元组和列表:当你传入元组作为DataFrame的列值时,Polars会自动将其转换为list类型存储。这就是测试代码中dftuple_pl.equals(dflist_pl)返回True的核心原因——两者的底层存储类型和内容完全一致。
从输出结果也能验证这一点:无论用元组还是列表创建DataFrame,列的类型都是list[str],执行unique()后的结果也完全相同。
测试代码:
import polars as pl dftuple_pl = pl.DataFrame({"col1": [("a", "a"), ("a", "a")], "col2": [("b", "b"), ("b", "b")]}) dflist_pl = pl.DataFrame({"col1": [["a", "a"], ["a", "a"]], "col2": [["b", "b"], ["b", "b"]]}) print(dftuple_pl.equals(dflist_pl)) # True print(dftuple_pl.unique()) # shape: (1, 2) # ┌────────────┬────────────┐ # │ col1 ┆ col2 │ # │ --- ┆ --- │ # │ list[str] ┆ list[str] │ # ╞════════════╪════════════╡ # │ ["a", "a"] ┆ ["b", "b"] │ # └────────────┴────────────┘ print(dflist_pl.unique()) # shape: (1, 2) # ┌────────────┬────────────┐ # │ col1 ┆ col2 │ # │ --- ┆ --- │ # │ list[str] ┆ list[str] │ # ╞════════════╪════════════╡ # │ ["a", "a"] ┆ ["b", "b"] │ # └────────────┴────────────┘
二、与Pandas的核心差异
Pandas严格区分元组和列表的特性:
- 元组是不可变序列,具备可哈希性,因此可以直接用于
drop_duplicates()去重; - 列表是可变序列,不可哈希,执行去重操作会抛出
TypeError: unhashable type: 'list'。
测试代码:
import pandas as pd dftuple_pd = pd.DataFrame({"col1": [("a", "a"), ("a", "a")], "col2": [("b", "b"), ("b", "b")]}) dflist_pd = pd.DataFrame({"col1": [["a", "a"], ["a", "a"]], "col2": [["b", "b"], ["b", "b"]]}) print(dftuple_pd.equals(dflist_pd)) # False print(dftuple_pd.drop_duplicates()) # col1 col2 # 0 (a, a) (b, b) print(dflist_pd.drop_duplicates()) # TypeError: unhashable type: 'list'
三、Polars中.map_elements(tuple)的作用分析
在Polars中,这个操作本质上无用,原因如下:
- Polars不支持单独的元组类型:即使你通过
map_elements(tuple)将列表转换为元组,Polars会立刻将其重新解析为list类型存储,最终列的类型和内容与原列完全一致; - Polars的
list类型本身支持基于元素内容和顺序的相等性判断、去重等操作,不需要依赖元组的可哈希性——这和Pandas的逻辑完全不同,你不需要将列表转成元组就能实现去重。
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

