在 polars 中,可通过 `pl.coalesce` 结合 `pl.when/then` 动态匹配每行最大值对应的列名,实现类似 pandas `idxmax(axis=1)` 的功能,无需循环或 udf,完全向量化且高效。
要获取每行中最大值所在的列名(而非数值本身),Polars 并未提供直接等价于 Pandas idxmax(axis=1) 的内置表达式(如 pl.idxmax_horizontal 尚未存在),但可通过组合现有表达式优雅、高效地实现该逻辑。
核心思路是:
以下是完整可运行示例:
import polars as pl
df = pl.DataFrame(
{
"a": [1, 8, 3],
"b": [4, 5, None],
}
)
# 获取每行最大值所在列名(字符串)
df = df.with_columns(
max_col=pl.coalesce(
pl.when(pl.col(name) == pl.max_horizontal(df.columns))
.then(pl.lit(name))
for name in df.columns
)
)
print(df)输出:
shape: (3, 3) ┌─────┬──────┬─────────┐ │ a ┆ b ┆ max_col │ │ --- ┆ --- ┆ --- │ │ i64 ┆ i64 ┆ str │ ╞═════╪══════╪═════════╡ │ 1 ┆ 4 ┆ b │ │ 8 ┆ 5 ┆ a │ │ 3 ┆ null ┆ a │ └─────┴──────┴─────────┘
✅ 关键说明:
⚠️ 注意事项:

综上,该模式是 Polars 生态中实现 idxmax(axis=1) 语义的标准、高效、声明式解法,值得纳入日常数据处理工具箱。