Например, предположим, что я хочу fill_null(strategy = "zero")
только числовые столбцы моего DataFrame. Моя текущая стратегия состоит в том, чтобы сделать это:
import polars as pl
import polars.selectors as cs
df = pl.DataFrame(
[
pl.Series("id", ["alpha", None, "gamma"]),
pl.Series("xs", [None, 100, 2]),
]
)
final_df = df.select(cs.exclude(cs.numeric()))
final_df = final_df.with_columns(
df.select(cs.numeric()).fill_null(strategy = "zero")
)
print(final_df)
shape: (3, 2)
┌───────┬─────┐
│ id ┆ xs │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════╪═════╡
│ alpha ┆ 0 │
│ null ┆ 100 │
│ gamma ┆ 2 │
└───────┴─────┘
Существуют ли альтернативные, более идиоматические или более эффективные методы достижения того, чего я хочу?
@roganjosh Я создаю final_df
из df
, исключая числовые столбцы. df
остается без изменений. Затем из df
я выбираю только числовые столбцы, а затем заполняю нулевые значения в этом уменьшенном df
. Наконец, я снова добавляю столбцы этого уменьшенного - df
обратно в final_df
. Вы новичок в Polars? Это суперстандартные вещи: до такой степени, что я, вероятно, слишком наивен.
df.with_columns(cs.numeric().fill_null(strategy = "zero").name.keep())
чувствуете, что это должно сработать? Я не знаю, как исключение числовых столбцов должно привести к их заполнению.
Вы можете просто использовать: final_df = df.with_columns(df.select(cs.numeric()).fill_null(strategy = 'zero'))
Вы должны предоставить полностью работоспособный пример вместе с ожидаемым результатом, чтобы людям было легче увидеть точную проблему. Просто: df.with_columns(cs.numeric().fill_null(strategy = "zero"))
- не нужно сначала отфильтровывать несовпадающие столбцы в отдельный select
и перестраивать результат.
@jqurious Готово.
pl.DataFrame.select возвращает фрейм данных, который содержит только столбцы, указанные в качестве аргументов. Альтернативно, pl.DataFrame.with_columns добавляет столбцы в фрейм данных (и заменяет столбцы с тем же именем).
В частности, это предоставляет вам инструменты для выполнения заполнения без промежуточного фрейма данных. Вы можете просто использовать pl.DataFrame.with_columns
, чтобы заполнить недостающие значения только в числовых столбцах (т. е. заменить их заполненными версиями).
df.with_columns(
cs.numeric().fill_null(strategy = "zero")
)
shape: (3, 2)
┌───────┬─────┐
│ id ┆ xs │
│ --- ┆ --- │
│ str ┆ i64 │
╞═══════╪═════╡
│ alpha ┆ 0 │
│ null ┆ 100 │
│ gamma ┆ 2 │
└───────┴─────┘
Обратите внимание, что pl.NUMERIC_DTYPES
устарел и cs.numeric()
является предпочтительным методом выбора по dtype.
@BallpointBen Хороший улов. Я отредактировал вопрос соответствующим образом.
@roganjosh Я пропустил импорт. Я использую
polars.selectors
: docs.pola.rs/api/python/stable/reference/selectors.html