在 Polars df 内转置会导致“TypeError:尚未实现:嵌套对象类型”

问题描述 投票:0回答:1

我有这个数据:

┌────────────┬─────────────────────────────────────┐
│ col1       ┆ col2                                │
│ ---        ┆ ---                                 │
│ list[str]  ┆ list[list[str]]                     │
╞════════════╪═════════════════════════════════════╡
│ ["a"]      ┆ [["a"]]                             │
│ ["b", "c"] ┆ [["b", "c"], ["b", "c"], ["b", "c"] │
│ ["d"]      ┆ [["d"]]                             │
└────────────┴─────────────────────────────────────┘

我想让所有 b 和所有 c 都在第 2 行的同一个列表中,但是正如你所看到的,b 到 b 和 c 到 c 的关联在第 2 行中没有维护。对于 pandas,我使用了:

import pandas as pd

pddf = pd.DataFrame({"col1": [["a"], ["b", "c"], ["d"]],
                     "col2": [[["a"]], [["b", "c"], ["b", "c"], ["b", "c"]], [["d"]]]})

pddf["col2"] = pddf["col2"].apply(lambda listed: pd.DataFrame(listed).transpose().values.tolist())

print(pddf)
---
     col1                    col2
0     [a]                   [[a]]
1  [b, c]  [[b, b, b], [c, c, c]]
2     [d]                   [[d]]

这就是想要的结果。我试图对极坐标做同样的事情,用

pddf.transpose().values.tolist()
替换
pldf.transpose().to_numpy().tolist()
,但我总是得到 和
TypeError: not yet implemented: Nested object types
。有什么解决方法吗?这是完整的极坐标代码:

import polars as pl

pldf = pl.DataFrame({"col1": [["a"], ["b", "c"], ["d"]],
                     "col2": [[["a"]], [["b", "c"], ["b", "c"], ["b", "c"]], [["d"]]]})

pldf = pldf.with_columns(pl.lit(pldf["col2"].map_elements(lambda listed: pl.DataFrame(listed).transpose().to_numpy().tolist())).alias("col2"))

print(pldf)
---
TypeError: not yet implemented: Nested object types

Hint: Try setting `strict=False` to allow passing data with mixed types.

我需要在哪里应用上述

strict=False

在更简单的 df 上

pddf.transpose().values.tolist()
pldf.transpose().to_numpy().tolist()
是相同的:

import pandas as pd
import polars as pl

pd.DataFrame(
    {"col1": ["a", "b", "c"],
     "col2": ["d", "e", "f"]}
     ).transpose().values.tolist() == pl.DataFrame(
                                          {"col1": ["a", "b", "c"],
                                           "col2": ["d", "e", "f"]}
                                           ).transpose().to_numpy().tolist()
---
True

请尽可能接近代码,即使使用

.apply()
.map_elements()
并不理想,但这是一个更大的项目,我不想破坏其他任何东西:)。

(编辑:我稍微简化了代码,因为第二个 lambda 对于这个问题来说并不是真正必要的。)

python pandas transpose python-polars
1个回答
0
投票

我会这样做。我将定义一个函数

transpose_nested(listed)
来 zip 来转置每个内部列表。基本上,与 pandas 中的
transpose().values.tolist()
相同。那么,我会
map_elements(transpose_nested)

import polars as pl

pldf = pl.DataFrame({
    "col1": [["a"], ["b", "c"], ["d"]],
    "col2": [[["a"]], [["b", "c"], ["b", "c"], ["b", "c"]], [["d"]]]
})

print(pldf)

def transpose_nested(listed):
    return list(map(list, zip(*listed)))

pldf = pldf.with_columns(
    pldf["col2"].map_elements(transpose_nested).alias("col2")
)

print(pldf)

返回原始数据和转换后的数据:

shape: (3, 2)
┌────────────┬─────────────────────────────────┐
│ col1       ┆ col2                            │
│ ---        ┆ ---                             │
│ list[str]  ┆ list[list[str]]                 │
╞════════════╪═════════════════════════════════╡
│ ["a"]      ┆ [["a"]]                         │
│ ["b", "c"] ┆ [["b", "c"], ["b", "c"], ["b",… │
│ ["d"]      ┆ [["d"]]                         │
└────────────┴─────────────────────────────────┘
shape: (3, 2)
┌────────────┬─────────────────────────────────┐
│ col1       ┆ col2                            │
│ ---        ┆ ---                             │
│ list[str]  ┆ list[list[str]]                 │
╞════════════╪═════════════════════════════════╡
│ ["a"]      ┆ [["a"]]                         │
│ ["b", "c"] ┆ [["b", "b", "b"], ["c", "c", "… │
│ ["d"]      ┆ [["d"]]                         │
└────────────┴─────────────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.