我有两列
pl.List(pl.List(str))
类型的列,我想按元素附加像 ;
这样的分隔符。
给定一个数据框
df = pl.DataFrame({
"A":[["Hi", "my", "is"],["I am"]],
"B":[["there", "name", "mr.x"], ["smart"]]
})
shape: (2, 2)
┌────────────────────┬───────────────────────────┐
│ A ┆ B │
│ --- ┆ --- │
│ list[str] ┆ list[str] │
╞════════════════════╪═══════════════════════════╡
│ ["Hi", "my", "is"] ┆ ["there", "name", "mr.x"] │
│ ["I am"] ┆ ["smart"] │
└────────────────────┴───────────────────────────┘
我期望输出是
shape: (2, 1)
┌────────────────────────────────────┐
│ A │
│ --- │
│ list[str] │
╞════════════════════════════════════╡
│ ["Hi;there", "my;name", "is;mr.x"] │
│ ["I am;smart"] │
└────────────────────────────────────┘
我怎样才能在本地做到这一点?
直接的做法是某种
explode()/calculate/implode()
的方式。
pl.DataFrame.with_row_index()
分配索引,以便我们稍后可以按它进行分组。pl.Expr.explode()
将列表分解为行。pl.Expr.implode()
内爆列表回来。pl.Expr.over()
在每行内运行计算。(
df
.with_row_index()
.select(
(pl.col.A.explode() + ';' + pl.col.B.explode())
.implode()
.over("index")
.alias("A")
)
)
# or
# (
# df
# .with_row_index()
# .explode("A","B")
# .select(pl.col.index, A = pl.col.A + ';' + pl.col.B)
# .group_by("index")
# .agg(pl.all())
# .drop("index")
# )
shape: (2, 1)
┌────────────────────────────────────┐
│ A │
│ --- │
│ list[str] │
╞════════════════════════════════════╡
│ ["Hi;there", "my;name", "is;mr.x"] │
│ ["I am;smart"] │
└────────────────────────────────────┘
或者,您可以采用某种
list.eval()
方法,但要做到这一点,您需要在列表中拥有所需的所有信息。
pl.concat_list()
将 A
和 B
连接到一个连续列表中。pl.Expr.list.eval()
运行列表元素的表达式。pl.Expr.shift()
移动列表中的元素。(
df
.select(
A =
pl.concat_list(pl.col.A, pl.col.B, pl.col.A.list.len())
.list.eval(
pl.element() + ';' +
pl.element().shift(-pl.element().last().cast(pl.Int32))
)
.list.head(pl.col.A.list.len())
)
)
shape: (2, 1)
┌────────────────────────────────────┐
│ A │
│ --- │
│ list[str] │
╞════════════════════════════════════╡
│ ["Hi;there", "my;name", "is;mr.x"] │
│ ["I am;smart"] │
└────────────────────────────────────┘
Structs
实际上实现了每个字段的字符串添加,因此您只需将 list
转换为 Struct
并返回。
pl.Expr.list.to_struct()
将 A
和 B
转换为结构体。pl.Expr.repeat_by()
创建 ;
列表,以便您可以在计算中使用它。pl.Expr.struct.unnest()
将结构解除嵌套到列中。pl.concat_list()
将列连接到列表中。(
df
.select(
pl.col.A.list.to_struct() +
pl.lit(";").repeat_by(pl.col.A.list.len()).list.to_struct() +
pl.col.B.list.to_struct()
)
.select(
pl.concat_list(pl.col.A.struct.unnest()).list.drop_nulls()
# or
# pl.concat_list(pl.col.A.struct.field("*")).list.drop_nulls()
)
)
shape: (2, 1)
┌────────────────────────────────────┐
│ A │
│ --- │
│ list[str] │
╞════════════════════════════════════╡
│ ["Hi;there", "my;name", "is;mr.x"] │
│ ["I am;smart"] │
└────────────────────────────────────┘