python Polars:带有枢轴和连接的 df 分区

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

我的目标是按一列(下面的 a)进行分组/分区,创建一个字符串标识符(b 和 c 列),然后使用此 b_c 标识符作为旋转数据框中的列的名称。 据我所知,下面的代码工作正常,但获得结果的路径有点扭曲。所以我的问题是:可以用更简单的方式来完成吗? 顺便说一句,在这么小的规模(到目前为止最多 1k 行)下,我并不痴迷于让它更快。

data = {
    "a": [1, 1, 1, 2, 2, 3],
    "b": [11, 12, 13, 11, 12, 11],
    "c": ["x1", "x2", "x3", "x1", "x2", "x1"],
    "val": [101, 102, 102, 201, 202, 301],
}
df = pl.DataFrame(data)

print(df)

counter = 0
for tmp_df in df.partition_by("a"):
    grp_df = (
        tmp_df.with_columns((pl.col("b").cast(pl.String) + "_" + pl.col("c").cast(pl.String)).alias("col_id"))
        .drop("b", "c")
        .pivot("col_id", index="a")
    )

    if counter == 0:
        result_df = grp_df.select(pl.all())
    else:
        result_df = pl.concat([result_df, grp_df], how="diagonal")
    counter += 1

print(result_df)

输出:

shape: (3, 4)
┌─────┬───────┬───────┬───────┐
│ a   ┆ 11_x1 ┆ 12_x2 ┆ 13_x3 │
│ --- ┆ ---   ┆ ---   ┆ ---   │
│ i64 ┆ i64   ┆ i64   ┆ i64   │
╞═════╪═══════╪═══════╪═══════╡
│ 1   ┆ 101   ┆ 102   ┆ 102   │
│ 2   ┆ 201   ┆ 202   ┆ null  │
│ 3   ┆ 301   ┆ null  ┆ null  │
└─────┴───────┴───────┴───────┘
python python-polars
1个回答
2
投票

您可以分两步完成此操作:首先选择步骤来创建新的

id
列,然后是枢轴。

示例1

(
    df.select(
        'a','val',
        id = pl.col('b').cast(pl.Utf8) + '_' + pl.col('c'))
    .pivot(values='val',index='a', columns='id')
)

# Result
shape: (3, 4)
┌─────┬───────┬───────┬───────┐
│ a   ┆ 11_x1 ┆ 12_x2 ┆ 13_x3 │
│ --- ┆ ---   ┆ ---   ┆ ---   │
│ i64 ┆ i64   ┆ i64   ┆ i64   │
╞═════╪═══════╪═══════╪═══════╡
│ 1   ┆ 101   ┆ 102   ┆ 102   │
│ 2   ┆ 201   ┆ 202   ┆ null  │
│ 3   ┆ 301   ┆ null  ┆ null  │
└─────┴───────┴───────┴───────┘

示例2: (由@jqurious建议),使用pl.format

(
    df.select(
        'a','val',
        id = pl.format("{}_{}", "b", "c"))
    .pivot(values='val',index='a', columns='id')
)
© www.soinside.com 2019 - 2024. All rights reserved.