我希望能够使用具有两列的 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/