Получить имя столбца максимальной даты на полярах

Я пытаюсь получить имя столбца, содержащее максимальное значение даты в моем DataFrame Polars. Я нашел похожий вопрос, на который уже был дан ответ здесь.

Однако в моем случае столбцов много, и добавлять их вручную было бы утомительно. Я хотел бы использовать селекторы столбцов cs.datetime() и попробовал следующее:

import polars as pl
from datetime import datetime
import polars.selectors as cs

data = {
    "ID" : [1,2,3],
    "Values_A" : [datetime(1,1,2),datetime(1,1,3),datetime(1,1,4)],
    "Values_B" : [datetime(1,1,4),datetime(1,1,7),datetime(1,1,2)]
}

df = pl.DataFrame(data)

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

(
    df
    .with_columns(
        Largest=arg_max_horizontal(pl.select(cs.datetime()))
    )
)

Вам нужна одна строка с именем столбца, содержащим максимальную дату в целом, или имя столбца с максимальной датой для каждой строки?

BallpointBen 24.07.2024 19:12

Мне нужно имя столбца с максимальной датой в строке

Simon 24.07.2024 19:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
2
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы были в одном шаге от вас, и вам просто нужно было выбрать названия интересующих столбцов, используя df.select(cs.datetime()).columns. Затем мы можем распаковать список при вызове функции.

Примечание. Я соответствующим образом адаптировал подсказку arg_max_horizontal. Более того (спасибо @Cameron Riddell) мы можем упростить преобразование в строковое представление, используя приведение к подходящему pl.Enum.

def arg_max_horizontal(*columns: str) -> pl.Expr:
    return (
        pl.concat_list(columns)
        .list.arg_max()
        .cast(pl.Enum(columns))
    )

(
    df
    .with_columns(
        Largest=arg_max_horizontal(*df.select(cs.datetime()).columns)
    )
)
shape: (3, 4)
┌─────┬─────────────────────┬─────────────────────┬──────────┐
│ ID  ┆ Values_A            ┆ Values_B            ┆ Largest  │
│ --- ┆ ---                 ┆ ---                 ┆ ---      │
│ i64 ┆ datetime[μs]        ┆ datetime[μs]        ┆ str      │
╞═════╪═════════════════════╪═════════════════════╪══════════╡
│ 1   ┆ 0001-01-02 00:00:00 ┆ 0001-01-04 00:00:00 ┆ Values_B │
│ 2   ┆ 0001-01-03 00:00:00 ┆ 0001-01-07 00:00:00 ┆ Values_B │
│ 3   ┆ 0001-01-04 00:00:00 ┆ 0001-01-02 00:00:00 ┆ Values_A │
└─────┴─────────────────────┴─────────────────────┴──────────┘

Вы можете избежать .replace_strict, используя вместо этого .cast(pl.Enum(columns)), поскольку list.arg_max() вернет вам основные физические значения категориально-подобного ряда.

Cameron Riddell 24.07.2024 23:11

@CameronRiddell Спасибо! Я отредактировал ответ, включив в него такой состав.

Hericks 25.07.2024 10:08

Другие вопросы по теме