Подсчет всех «-1» и -1 в кадре данных для списка определенных столбцовPython

Программы на Python
Ответить
Anonymous
 Подсчет всех «-1» и -1 в кадре данных для списка определенных столбцов

Сообщение Anonymous »

У меня есть фрейм данных Polars, и для некоторых столбцов я хочу подсчитать количество «-1» (если символ) и -1 (если число). Мне бы хотелось сделать этот запрос действительно быстрым, поэтому я очень заинтересован в изучении правильного кода Polars, чтобы он работал очень быстро.

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

import polars as pl
import polars.selectors as cs
import numpy as np

df = pl.DataFrame( {"int_1": [1, 2, 3, -1, 5],
"char_1": ["foo", "ham", "spam", "egg", "-1"],
"not_of_interest": np.random.rand(5),
"groups": ["A", "A", "B", "C", "B"],
"int_2": [12, 12, 13, 14, 15]
}
)
Желаемый фрейм данных выглядит следующим образом:

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

shape: (3, 4)
┌────────┬───────┬───────┬────────┐
│ groups ┆ int_1 ┆ int_2 ┆ char_1 │
│ ---    ┆ ---   ┆ ---   ┆ ---    │
│ str    ┆ i64   ┆ i64   ┆ i64    │
╞════════╪═══════╪═══════╪════════╡
│ B      ┆ 0     ┆ 0     ┆ 1      │
│ C      ┆ 1     ┆ 0     ┆ 0      │
│ A      ┆ 0     ┆ 0     ┆ 0      │
└────────┴───────┴───────┴────────┘
Моя попытка на данный момент:

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

df.select(cs.numeric() | cs.by_name("groups")) \
.group_by("groups").agg((pl.col("*") == pl.lit(-1)).sum())

df.select(cs.string() | cs.by_name("groups")) \
.group_by("groups").agg((pl.col("*") == pl.lit("-1")).sum())
Тогда я мог бы объединить эти две таблицы, но я хочу сделать это в одном запросе.
Я также хотел бы определить два списка: один для переменных, которые нужно группировать, а другой - набор переменных, для которых мне интересно найти -1, чтобы мне не приходилось жестко запрограммировать «группы», но я действительно не уверен, является ли то, что я делаю, хорошим кодом или нет:

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

cols_to_check = ['int_1', 'int_2', 'char_1']
group_cols = ['groups']

df.select((cs.string() & cs.by_name(*cols_to_check)) | cs.by_name(*group_cols)) \
.group_by(group_cols).agg((pl.col("*") == pl.lit("-1")).sum())

df.select((cs.numeric() & cs.by_name(*cols_to_check)) | cs.by_name(*group_cols)) \
.group_by(group_cols).agg((pl.col("*") == pl.lit(-1)).sum())
РЕДАКТИРОВАТЬ: думаю, мне это удалось.

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

# attempt:
df.group_by(group_cols).agg(((cs.numeric() & cs.by_name(*[cols_to_check])) == -1).sum(),
((cs.string() & cs.by_name(*[cols_to_check])) == "-1").sum())
Честно говоря, я не знал, что это сработает. Наверное, мне не хватает понимания того, когда можно использовать селекторы столбцов...


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

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

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

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

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

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