我有这个数据:
┌────────────┬─────────────────────────────────────┐
│ 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 对于这个问题来说并不是真正必要的。)
我会这样做。我将定义一个函数
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"]] │
└────────────┴─────────────────────────────────┘