在Python极坐标上对数据帧上的一组列应用百分位数排名

问题描述 投票:0回答:1
df = pl.DataFrame(
    {   
        "era": ["01", "01", "02", "02", "03", "03"],
        "pred1": [1, 2, 3, 4, 5,6],
        "pred2": [2,4,5,6,7,8],
        "pred3": [3,5,6,8,9,1],
        "something_else": [5,4,3,67,5,4],
    }
)
pred_cols = ["pred1", "pred2", "pred3"]
ERA_COL = "era"

我正在尝试做一个相当于 Polars 上熊猫排名百分位数的事情。 Polars 的

rank
功能缺少 Pandas 具有的
pct
标志。

我在这里查看了另一个问题:如何用极坐标替换 pandas df.rank(axis=1)

但是问题的结果(并将其应用到我的代码中)有些不对劲。计算 Pandas 中的排名百分比,给我一个浮点数,Polars 提供的示例给我一个数组,而不是浮点数,所以在示例中计算出不同的东西。

举个例子,Pandas 代码是这样的:

df[list(pred_cols)] = df.groupby(ERA_COL, group_keys=False).apply(
    lambda d: d[list(pred_cols)].rank(pct=True)
)
python python-polars rank
1个回答
5
投票

您可以使用提到的

.rank() / .count()
方法与
.over()

df.select(
    (pl.col(pred_cols).rank() / pl.col(pred_cols).count())
       .over(ERA_COL)
)
shape: (6, 3)
┌───────┬───────┬───────┐
│ pred1 ┆ pred2 ┆ pred3 │
│ ---   ┆ ---   ┆ ---   │
│ f64   ┆ f64   ┆ f64   │
╞═══════╪═══════╪═══════╡
│ 0.5   ┆ 0.5   ┆ 0.5   │
│ 1.0   ┆ 1.0   ┆ 1.0   │
│ 0.5   ┆ 0.5   ┆ 0.5   │
│ 1.0   ┆ 1.0   ┆ 1.0   │
│ 0.5   ┆ 0.5   ┆ 1.0   │
│ 1.0   ┆ 1.0   ┆ 0.5   │
└───────┴───────┴───────┘

.with_columns()
如果你想“替换”原始值。

df.with_columns(
    (pl.col(pred_cols).rank() / pl.col(pred_cols).count())
       .over(ERA_COL)
)
shape: (6, 5)
┌─────┬───────┬───────┬───────┬────────────────┐
│ era ┆ pred1 ┆ pred2 ┆ pred3 ┆ something_else │
│ --- ┆ ---   ┆ ---   ┆ ---   ┆ ---            │
│ str ┆ f64   ┆ f64   ┆ f64   ┆ i64            │
╞═════╪═══════╪═══════╪═══════╪════════════════╡
│ 01  ┆ 0.5   ┆ 0.5   ┆ 0.5   ┆ 5              │
│ 01  ┆ 1.0   ┆ 1.0   ┆ 1.0   ┆ 4              │
│ 02  ┆ 0.5   ┆ 0.5   ┆ 0.5   ┆ 3              │
│ 02  ┆ 1.0   ┆ 1.0   ┆ 1.0   ┆ 67             │
│ 03  ┆ 0.5   ┆ 0.5   ┆ 1.0   ┆ 5              │
│ 03  ┆ 1.0   ┆ 1.0   ┆ 0.5   ┆ 4              │
└─────┴───────┴───────┴───────┴────────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.