Как я могу выполнить набор функций для всех столбцов в кадре данных Polars?Python

Программы на Python
Ответить
Anonymous
 Как я могу выполнить набор функций для всех столбцов в кадре данных Polars?

Сообщение Anonymous »

Я пытаюсь выполнить несколько операций со всеми столбцами в кадре данных Polars, используя функцию pl.all.

Код: Выделить всё

df = pl.DataFrame(
{"a": [1, 2, 3], "b": [4, 5, 6], "c": [1, 1, 1]}
)
В настоящее время я использую этот код:

Код: Выделить всё

def col_operations(column: pl.Series):
col_stats = {
"count_unique": column.n_unique(),
"count_nans": column.null_count(),
"nan_frac": column.null_count()/len(column)
}

return col_stats

def profile(df: pl.DataFrame):
profiling_dict = {}
for col in df.columns:
profiling_dict[col] = col_operations(df[col])

return pd.DataFrame(profiling_dict) # NOTE: pandas

profile(df)
который возвращает то, что я хочу видеть:

Код: Выделить всё

                a   b   c
count_unique    3.0 3.0 1.0
count_nans      0.0 0.0 0.0
nan_frac        0.0 0.0 0.0
Однако в моем реальном случае использования я работаю над таблицами, которые могут иметь ~15 столбцов и потенциально миллионы строк, поэтому я ищу что-то более быстрое, чем то, что я придумал.
Я пытался использовать pl.all в качестве аргумента df.select, но получаю ошибку.

Код: Выделить всё

df.select(pl.all().sum(), pl.all().mean())

Код: Выделить всё

# DuplicateError: the name 'a' is duplicate
Похоже, добавление суффикса работает:

Код: Выделить всё

df.select(pl.all().sum().name.suffix("_sum"), pl.all().first().name.suffix("_first"))

Код: Выделить всё

shape: (1, 6)
┌───────┬───────┬───────┬─────────┬─────────┬─────────┐
│ a_sum ┆ b_sum ┆ c_sum ┆ a_first ┆ b_first ┆ c_first │
│ ---   ┆ ---   ┆ ---   ┆ ---     ┆ ---     ┆ ---     │
│ i64   ┆ i64   ┆ i64   ┆ i64     ┆ i64     ┆ i64     │
╞═══════╪═══════╪═══════╪═════════╪═════════╪═════════╡
│ 6     ┆ 15    ┆ 3     ┆ 1       ┆ 4       ┆ 1       │
└───────┴───────┴───────┴─────────┴─────────┴─────────┘
Это то, что я хочу видеть, однако я бы предпочел использовать такой формат в первом примере.
С Pandas я могу сделать это с помощью .apply:

Код: Выделить всё

def col_operations(column: pd.Series):
col_stats = {
"count_unique": column.nunique(),
"count_nans": column.isna().sum(),
"nan_frac": column.isna().sum()/len(column)
}

return pd.Series(col_stats)

Код: Выделить всё

df.to_pandas().apply(col_operations, axis=0)

Код: Выделить всё

                a    b    c
count_unique  3.0  3.0  1.0
count_nans    0.0  0.0  0.0
nan_frac      0.0  0.0  0.0
Можно ли это каким-то образом сделать с помощью Polars?


Подробнее здесь: https://stackoverflow.com/questions/758 ... -dataframe
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»