Python polars: раздел df с пивотом и конкатом

моя цель состояла в том, чтобы сгруппировать/разделить по одному столбцу (a ниже), создать строковый идентификатор (столбцы b и c), а затем использовать этот идентификатор b_c в качестве имени для столбца в сводном фрейме данных. Код ниже работает нормально, насколько я могу судить, но путь к получению результата немного искривлен. Итак, мой вопрос: можно ли это сделать проще? Кстати, в этом крошечном масштабе (максимум 1 тыс. строк) я не одержим, чтобы сделать это быстрее.

data = {
    "a": [1, 1, 1, 2, 2, 3],
    "b": [11, 12, 13, 11, 12, 11],
    "c": ["x1", "x2", "x3", "x1", "x2", "x1"],
    "val": [101, 102, 102, 201, 202, 301],
}
df = pl.DataFrame(data)

print(df)

counter = 0
for tmp_df in df.partition_by("a"):
    grp_df = (
        tmp_df.with_columns((pl.col("b") + "_" + pl.col("c")).alias("col_id"))
        .drop(["b", "c"])
        .pivot(values = "val", index = "a", columns = "col_id")
    )

    if counter == 0:
        result_df = grp_df.select(pl.all())
    else:
        result_df = pl.concat([result_df, grp_df], how = "diagonal")
    counter += 1

print(result_df)

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

вы можете сделать это за 2 шага: сначала шаг выбора для создания нового столбца id, а затем поворот.

Пример 1:

(
    df.select(
        'a','val',
        id = pl.col('b').cast(pl.Utf8) + '_' + pl.col('c'))
    .pivot(values='val',index='a', columns='id')
)

# Result
shape: (3, 4)
┌─────┬───────┬───────┬───────┐
│ a   ┆ 11_x1 ┆ 12_x2 ┆ 13_x3 │
│ --- ┆ ---   ┆ ---   ┆ ---   │
│ i64 ┆ i64   ┆ i64   ┆ i64   │
╞═════╪═══════╪═══════╪═══════╡
│ 1   ┆ 101   ┆ 102   ┆ 102   │
│ 2   ┆ 201   ┆ 202   ┆ null  │
│ 3   ┆ 301   ┆ null  ┆ null  │
└─────┴───────┴───────┴───────┘

Пример 2: (предложено @jqurious), используя pl.format

(
    df.select(
        'a','val',
        id = pl.format("{}_{}", "b", "c"))
    .pivot(values='val',index='a', columns='id')
)

Спасибо. Это более приятный способ сделать это. Ваш код работает с полярами '0.16.14' python 3.10.6. У меня была проблема с запуском с polars 0.16.16, но это была случайность: возможно, какая-то проблема с jupyter/PATH.

darked89 31.03.2023 11:53

Привет @ darked89, я попробовал код на своей машине с Polars 0.16.16 и Python 3.11, и он сработал. Так что я думаю, что это тоже что-то, не связанное с Polars (например, вы упоминаете Jupyter или проблему с путями). Если это все еще не работает, пожалуйста, поделитесь об этом

Luca 31.03.2023 13:18

Возможно, пример pl.format также может быть полезен, чтобы показать: df.with_columns(pl.format("{}_{}", "b", "c").pivot()

jqurious 31.03.2023 16:56

хорошая идея @jqurious. я добавлю это

Luca 31.03.2023 17:05

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