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)
)
您可以使用提到的
.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 │
└─────┴───────┴───────┴───────┴────────────────┘