Как объединить два столбца в пары `{ключ:значение}` в полярах?

Я работаю с Polars DataFrame и хочу объединить два столбца в формат словаря, где значения из одного столбца станут ключами, а значения из другого столбца станут соответствующими значениями.

Вот пример DataFrame:

import polars as pl

df = pl.DataFrame({
    "name": ["Chuck", "John", "Alice"],
    "surname": ["Dalliston", "Doe", "Smith"]
})

Я хочу преобразовать этот DataFrame в новый столбец, содержащий словари, где имя — это ключ, а фамилия — значение. Ожидаемый результат должен выглядеть следующим образом:

shape: (3, 3)
┌───────┬─────────┬──────────────────────────┐
│ name  │ surname │ name_surname             │
│ ---   │ ---     │ ---                      │
│ str   │ str     │ dict[str, str]           │
├───────┼─────────┼──────────────────────────┤
│ Chuck │ Dalliston│ {"Chuck": "Dalliston"}   │
│ John  │ Doe     │ {"John": "Doe"}          │
│ Alice │ Smith   │ {"Alice": "Smith"}       │
└───────┴─────────┴──────────────────────────┘

Я попробовал следующий код:

df.with_columns(
    json = pl.struct("name", "surname").map_elements(json.dumps)
)

Но результат не такой, как ожидалось. Вместо создания словаря с помощью key-value он выдает:

{name:Chuck,surname:Dalliston}

У Polars нет собственного типа dict docs.pola.rs/api/python/stable/reference/datatypes.html. Вы можете сохранить словарь Python как pl.Object, но хорошая ли это идея зависит от того, как вы хотите использовать столбец после его создания.

Dogbert 10.08.2024 14:38

Затем новый столбец сохраняется в поле jsonb в базе данных postgres.

Dante 10.08.2024 14:59
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Вы можете попробовать этот фрагмент кода. Кажется, это самое близкое, что вы можете получить, если у pl нет наивного диктата.

См. ссылку: data_types_polaris

import polars as pl

df = pl.DataFrame(
    {"name": ["Chuck", "John", "Alice"], "surname": ["Dalliston", "Doe", "Smith"]}
)

df = df.select(
    [
        "name",
        "surname",
        (
            pl.struct(["name", "surname"]).map_elements(
                lambda row: {row["name"]: row["surname"]}, return_dtype=pl.Object
            )
        ).alias("name_surname"),
    ]
)
print(df)
┌───────┬───────────┬────────────────────────┐
│ name  ┆ surname   ┆ name_surname           │
│ ---   ┆ ---       ┆ ---                    │
│ str   ┆ str       ┆ object                 │
╞═══════╪═══════════╪════════════════════════╡
│ Chuck ┆ Dalliston ┆ {'Chuck': 'Dalliston'} │
│ John  ┆ Doe       ┆ {'John': 'Doe'}        │
│ Alice ┆ Smith     ┆ {'Alice': 'Smith'}     │
└───────┴───────────┴────────────────────────┘
import polars as pl

df = pl.DataFrame(
    {"name": ["Chuck", "John", "Alice"], "surname": ["Dalliston", "Doe", "Smith"]}
)
df = df.with_columns(
            json=pl.concat_str(
                pl.lit("{"),
                pl.col("specification_name"),
                pl.lit(":"),
                pl.col("specification_value"),
                pl.lit("}"),
                separator='"',
            )
        )

Это вернет json в виде строки

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