моя цель состояла в том, чтобы сгруппировать/разделить по одному столбцу (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)
вы можете сделать это за 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')
)
Привет @ darked89, я попробовал код на своей машине с Polars 0.16.16 и Python 3.11, и он сработал. Так что я думаю, что это тоже что-то, не связанное с Polars (например, вы упоминаете Jupyter или проблему с путями). Если это все еще не работает, пожалуйста, поделитесь об этом
Возможно, пример pl.format
также может быть полезен, чтобы показать: df.with_columns(pl.format("{}_{}", "b", "c").pivot()
хорошая идея @jqurious. я добавлю это
Спасибо. Это более приятный способ сделать это. Ваш код работает с полярами '0.16.14' python 3.10.6. У меня была проблема с запуском с polars 0.16.16, но это была случайность: возможно, какая-то проблема с jupyter/PATH.