python-polars - 用极坐标递归查找值?

标签 python-polars

我希望能够使用具有两列的 Polars DF 递归地获取每个经理的 manager_id:

“employee_id”、“manager_1_id”

在 pandas 中,这段代码是:

id_index = df.set_index("employee_id")["manager_1_id"]
for i in range(1, 12):
    df[f"manager_{str(i + 1)}_id"] = df[f"manager_{str(i)}_id"].map(id_index)

每个 manager_id 值也是一个员工 ID,最终我希望每个经理都有一个列:

“employee_id、manager_1_id、manager_2_id、manager_3_id、...”

有没有一种好方法可以在不运行 pandas 片段的情况下使用 Polars 实现此目的?我试图循环一些左连接,但这似乎不是一个很好的方法。

编辑:示例如下。原始数据有两列:员工 ID(所有数千名员工)及其直接经理的员工 ID。

employee_id | manager_1_id
    1       |      3
    2       |      5
    3       |      4
    4       |      5
    5       |

目标是将其扩展到列(manager_1 到 manager_12)

employee_id | manager_1_id | manager_2_id | manager_3_id | ...
     1              3             4              5
     2              5       
     3              4             5
     5              5
     5

希望这是清楚的。员工 1 向员工 3 汇报,员工 3 向员工 4 汇报,员工 4 向员工 5 汇报。员工 5 是 CEO,不向任何人汇报。

最佳答案

这是一种在 Polars 中执行与 Pandas 代码段相同的操作的方法:

import polars as pl

df = pl.DataFrame({"employee_id": range(1, 6), "manager_1_id": [3, 5, 4, 5, None]})
id_index = dict(df.iter_rows())
for i in range(1, df.select("manager_1_id").max().item()):
    df = df.with_columns(
        pl.col(f"manager_{i}_id")
        .map_dict(id_index)
        .alias(f"manager_{i+1}_id")
    )
# Remove empty columns
df = df[[s.name for s in df if not (s.null_count() == df.height)]].fill_null(0)

然后:

print(df)
# Output

┌─────────────┬──────────────┬──────────────┬──────────────┐
│ employee_id ┆ manager_1_id ┆ manager_2_id ┆ manager_3_id │
│ ---         ┆ ---          ┆ ---          ┆ ---          │
│ i64         ┆ i64          ┆ i64          ┆ i64          │
╞═════════════╪══════════════╪══════════════╪══════════════╡
│ 1           ┆ 3            ┆ 4            ┆ 5            │
│ 2           ┆ 5            ┆ 0            ┆ 0            │
│ 3           ┆ 4            ┆ 5            ┆ 0            │
│ 4           ┆ 5            ┆ 0            ┆ 0            │
│ 5           ┆ 0            ┆ 0            ┆ 0            │
└─────────────┴──────────────┴──────────────┴──────────────┘

关于python-polars - 用极坐标递归查找值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76238414/

相关文章:

python-3.x - 基于 Python Polars 列的更新不起作用

dataframe - 如何使用 Polars 按值列表过滤 df?

python - Polars - 如何用 Polars 表达式替换 df 中特定行和列的值(例如 df[3,4]=12)?

python - 在Python Polars中按列值向前填充

python - 如何更好地使用 Polars 中的 apply?

python-polars - Polar 获取 "this"事件之前但在给定持续时间内的事件计数

python - 优化 Polars 中具有不同 'weekmask' 逻辑的两个日期之间的 timedelta 计算

python - 连接数据帧时处理极坐标中的空列

python - 极地数据帧 : Date conversion of Utf8 column

python-polars - 如何将新列分配给极坐标数据框?