Я работаю с 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}
Затем новый столбец сохраняется в поле jsonb
в базе данных postgres.
Вы можете попробовать этот фрагмент кода. Кажется, это самое близкое, что вы можете получить, если у 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 в виде строки
У Polars нет собственного типа dict docs.pola.rs/api/python/stable/reference/datatypes.html. Вы можете сохранить словарь Python как pl.Object, но хорошая ли это идея зависит от того, как вы хотите использовать столбец после его создания.