在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 │
│ ---   ┆ ---   ┆ ---   │
│ f64f64f64   │
╞═══════╪═══════╪═══════╡
│ 0.50.50.5   │
│ 1.01.01.0   │
│ 0.50.50.5   │
│ 1.01.01.0   │
│ 0.50.51.0   │
│ 1.01.00.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 │
│ --- ┆ ---   ┆ ---   ┆ ---   ┆ ---            │
│ strf64f64f64i64            │
╞═════╪═══════╪═══════╪═══════╪════════════════╡
│ 010.50.50.55              │
│ 011.01.01.04              │
│ 020.50.50.53              │
│ 021.01.01.067             │
│ 030.50.51.05              │
│ 031.01.00.54              │
└─────┴───────┴───────┴───────┴────────────────┘
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.