polars - 获取包含每行最大值的列的名称

polars - get name of column containing max value per row

提问人:asongtoruin 提问时间:11/15/2023 更新时间:11/15/2023 访问量:38

问:

在中,我可以选择执行以下操作以获取包含每行最大值的列的名称:pandas

import pandas as pd

df = pd.DataFrame({'a': [1, 2, 3, 4, 5], 'b': [5, 4, 3, 2, 1]})

df['Largest'] = df.idxmax(axis=1)

这让我:

一个 b 最大
0 1 5 b
1 2 4 b
2 3 3 一个
3 4 2 一个
4 5 1 一个

我怎样才能在?似乎没有方法,并且似乎只返回值而不是任何索引信息。polarsidxmaxmax_horizontal

蟒蛇极地

评论


答:

2赞 ignoring_gravity 11/15/2023 #1

你可以做到

def arg_max_horizontal(*columns: pl.Expr) -> pl.Expr:
    return (
        pl.concat_list(columns)
        .list.arg_max()
        .map_dict({i: col_name for i, col_name in enumerate(columns)})
    )


print(dfpl.with_columns(Largest=arg_max_horizontal("a", "b")))

然后你会得到

Out[11]:
shape: (5, 3)
┌─────┬─────┬─────────┐
│ a   ┆ b   ┆ Largest │
│ --- ┆ --- ┆ ---     │
│ i64 ┆ i64 ┆ str     │
╞═════╪═════╪═════════╡
│ 1   ┆ 5   ┆ b       │
│ 2   ┆ 4   ┆ b       │
│ 3   ┆ 3   ┆ a       │
│ 4   ┆ 2   ┆ a       │
│ 5   ┆ 1   ┆ a       │
└─────┴─────┴─────────┘

评论

0赞 asongtoruin 11/15/2023
这太完美了!我几乎得到了与这个答案类似的方法,但你的方法似乎要快得多。谢谢!
0赞 ignoring_gravity 11/16/2023
顺便说一句,如果您想在 Polars github 上解决问题,这可能是一个很好的功能请求