在Polars中,我可以获得水平最大值(到达行的一组列的最大值),如下所示:

df = pl.DataFrame(
    {
        "a": [1, 8, 3],
        "b": [4, 5, None],
    }
)

df.with_columns(max = pl.max_horizontal("a", "b"))
┌─────┬──────┬─────┐
│ a   ┆ b    ┆ max │
│ --- ┆ ---  ┆ --- │
│ i64 ┆ i64  ┆ i64 │
╞═════╪══════╪═════╡
│ 1   ┆ 4    ┆ 4   │
│ 8   ┆ 5    ┆ 8   │
│ 3   ┆ null ┆ 3   │
└─────┴──────┴─────┘

这相当于Pandas df[["a", "b"]].max(axis=1).

现在,如何获得列名而不是实际的最大值? 换句话说,Pandas df[CHANGE_COLS].idxmax(axis=1)的极地版本是什么?

预期输出为:

┌─────┬──────┬─────┐
│ a   ┆ b    ┆ max │
│ --- ┆ ---  ┆ --- │
│ i64 ┆ i64  ┆ str │
╞═════╪══════╪═════╡
│ 1   ┆ 4    ┆ b   │
│ 8   ┆ 5    ┆ a   │
│ 3   ┆ null ┆ a   │
└─────┴──────┴─────┘

推荐答案

可以使用pl.concat_list将元素连接到一个列表中,使用pl.Expr.list.arg_max获取最大元素的索引,并使用pl.Expr.replace将索引替换为列名.

mapping = {0: "a", 1: "b"}
(
    df
    .with_columns(
        pl.concat_list(["a", "b"]).list.arg_max().replace(mapping).alias("max_col")
    )
)

这些都可以包装到一个函数中,以处理映射dict的创建.

def max_col(cols) -> str:
    mapping = dict(enumerate(cols))
    return pl.concat_list(cols).list.arg_max().replace(mapping)

df.with_columns(max_col(["a", "b"]).alias("max_col"))

Output.

shape: (3, 3)
┌─────┬──────┬─────────┐
│ a   ┆ b    ┆ max_col │
│ --- ┆ ---  ┆ ---     │
│ i64 ┆ i64  ┆ str     │
╞═════╪══════╪═════════╡
│ 1   ┆ 4    ┆ b       │
│ 8   ┆ 5    ┆ a       │
│ 3   ┆ null ┆ a       │
└─────┴──────┴─────────┘

Python相关问答推荐

线性模型PanelOLS和statmodels OLS之间的区别

如何检测背景有噪的图像中的正方形

max_of_three使用First_select、second_select、

try 在树叶 map 上应用覆盖磁贴

沿着数组中的轴计算真实条目

. str.替换pandas.series的方法未按预期工作

更改键盘按钮进入'

PMMLPipeline._ fit()需要2到3个位置参数,但给出了4个位置参数

在Python中管理打开对话框

driver. find_element无法通过class_name找到元素'""

形状弃用警告与组合多边形和多边形如何解决

创建可序列化数据模型的最佳方法

合并与拼接并举

在Python中从嵌套的for循环中获取插值

为用户输入的整数查找根/幂整数对的Python练习

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

如何在Airflow执行日期中保留日期并将时间转换为00:00

你能把函数的返回类型用作其他地方的类型吗?'

如何提高Pandas DataFrame中随机列 Select 和分配的效率?

PYTHON中的pd.wide_to_long比较慢