Python Polars Zip 多个列表类型的列

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

我有两列

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"]                     │
└────────────────────────────────────┘

我怎样才能在本地做到这一点?

python dataframe list python-polars
1个回答
2
投票

直接的做法是某种

explode()/calculate/implode()
的方式。

(
    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()
方法,但要做到这一点,您需要在列表中拥有所需的所有信息。

(
    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
并返回。

(
    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"]                     │
└────────────────────────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.