Polars DataFrame转置嵌套列表报错:TypeError: 暂未实现嵌套对象类型
Polars嵌套列表转置的TypeError解决办法
直接加个参数就能搞定
你遇到的错误是因为Polars默认开启了严格类型检查(strict=True),嵌套列表转置后的类型没法被它自动识别。只需要在map_elements里加上strict=False参数,就能绕过这个校验,同时保留你原来的写法。
举个实际例子:
import polars as pl # 先造个测试用的DataFrame df = pl.DataFrame({ "col1": [["a", "b"], ["x", "y"]], "col2": [[["b", "c"], ["b", "c"], ["b", "c"]], [["d", "e"], ["d", "e"]]] }) # 给map_elements加strict=False就行 df = df.with_columns( pl.col("col2").map_elements( lambda x: list(zip(*x)), # 这就是转置的核心逻辑,和你原来的写法一致 strict=False # 关键参数,关掉严格类型检查 ).alias("col2_transposed") ) print(df)
为啥加这个参数有用?
Polars的strict=True模式下,会强制检查map_elements返回值的类型是否和它推断的一致,但嵌套列表的转置操作,虽然结果还是list[list[str]],但Polars的类型推断在这种嵌套场景下还没完善,所以会报错。开strict=False就会跳过这个校验,直接接受返回的结果。
更严谨的写法(可选)
如果你不想依赖strict=False,也可以明确指定返回的类型,这样Polars就知道该怎么识别结果了,部分版本可能还是需要配合strict=False,看你用的Polars版本:
df = df.with_columns( pl.col("col2").map_elements( lambda x: list(zip(*x)), return_dtype=pl.List(pl.List(pl.Utf8)), # 明确告诉Polars返回的是字符串嵌套列表 strict=False ).alias("col2_transposed") )
小提醒
如果你的嵌套列表是不规则的(比如子列表长度不一样),用zip(*x)会自动截断到最短的子列表长度。要是需要补全缺失值,可以用itertools.zip_longest,记得先导入这个模块。
内容的提问来源于stack exchange,提问作者gernophil
相关产品推荐
相关产品推荐

