Скажем, у меня есть DataFrame, который выглядит так:
df = pl.DataFrame({
"id": [1, 2, 3, 4, 5],
"feature_a": np.random.randint(0, 3, 5),
"feature_b": np.random.randint(0, 3, 5),
"label": [1, 0, 0, 1, 1],
})
┌─────┬───────────┬───────────┬───────┐
│ id ┆ feature_a ┆ feature_b ┆ label │
│ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 ┆ i64 │
╞═════╪═══════════╪═══════════╪═══════╡
│ 1 ┆ 2 ┆ 0 ┆ 1 │
│ 2 ┆ 1 ┆ 1 ┆ 0 │
│ 3 ┆ 2 ┆ 2 ┆ 0 │
│ 4 ┆ 1 ┆ 0 ┆ 1 │
│ 5 ┆ 0 ┆ 0 ┆ 1 │
└─────┴───────────┴───────────┴───────┘
Я хочу изменить все столбцы функций на основе значения в столбце метки, создав новый фрейм данных.
┌─────┬───────────┬───────────┐
│ id ┆ feature_a ┆ feature_b │
│ --- ┆ --- ┆ --- │
│ i64 ┆ i64 ┆ i64 │
╞═════╪═══════════╪═══════════╡
│ 1 ┆ 1 ┆ 1 │
│ 2 ┆ 0 ┆ 0 │
│ 3 ┆ 0 ┆ 0 │
│ 4 ┆ 1 ┆ 1 │
│ 5 ┆ 1 ┆ 1 │
└─────┴───────────┴───────────┘
Я знаю, что могу выбрать все столбцы функций, используя регулярное выражение в селекторе столбцов.
pl.col(r"^feature_.*$")
И я могу использовать выражение когда/тогда для оценки столбца метки
pl.when(pl.col("label") == 1).then(1).otherwise(0)
Но я не могу собрать 2 вместе, чтобы изменить все выбранные столбцы одним махом. Это кажется таким простым, что я упускаю?
Вот один из способов:
Недавно была добавлена поддержка более эргономичных аргументов во многих методах, включая with_columns
и select
. Поскольку теперь они могут принимать любое количество аргументов ключевого слова, действующих как alias
в конце (например, задавая новое имя столбца), мы можем создать словарь столбцов для перезаписи и передать его (с распаковкой) следующим образом:
df.select('id', **{col : 'label' for col in df.columns if col.startswith('feature')})
В этом простом случае для столбца label
не требуется, когда/тогда, но в целом любое выражение, оценивающее столбец той же высоты, что и id
, может войти в это понимание dict.