Найти int в списке с нечетным счетчиком с помощью полярного фрейма данныхPython

Программы на Python
Ответить
Anonymous
 Найти int в списке с нечетным счетчиком с помощью полярного фрейма данных

Сообщение Anonymous »

Я выполняю задачу по кодированию, чтобы найти int в списке с нечетным значением value_count.
Хотя я нашел решение, из-за отсутствия опыта работы с полярами мне кажется, что оно многословно.
Пример задания:

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

input = "[[1,1,2,2,3,3,4],[9,9,8,8,7,7,6]]"

result = find_odd_counts(input)

print(result)
"[4,6]"

Решение, которое мне удалось найти:

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

import polars as pl
from time import perf_counter

data: str
with open("samples.json", "r") as file:
data = file.read()

t_start = perf_counter()

result = (
pl.LazyFrame({"data": data})
.select(pl.col("data").str.json_decode().explode())
.with_columns(
id = pl.int_range(0, pl.col("data").count())
)
.explode("data")
.group_by("id")
.agg(pl.col("data").value_counts(parallel=True))
.explode("data")
.unnest("data")
.group_by("id")
.agg(pl.col("data").filter(pl.col("count").mod(2) == 1))
.explode("data")
.collect()
.get_column("data")
.to_list()
)

t_stop = perf_counter()

print(result)
print(f"Compute {round((t_stop-t_start) * 1000, 2)}ms")
Разбивка процесса:
Разбор строки json:
Обратите внимание: из-за https://github.com/pola-rs/polars/issues/8470 я не могу использовать Polars.read_json

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

parsed_json = pl.DataFrame({"data": data}).select(pl.col("data").str.json_extract()).explode())
print(parsed_json)
shape: (500, 1)
┌────────────────┐
│ data           │
│ ---            │
│ list[u8]       │
╞════════════════╡
│ [7, 5, … 7]    │
│ [85, 73, … 90] │
│ [81, 86, … 89] │
│ [76, 26, … 96] │
│ …              │
│ [11, 37, … 85] │
│ [13, 51, … 94] │
│ [18, 18, 18]   │
│ [54, 60, … 98] │
└────────────────┘
Добавить столбец идентификатора:

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

ids = parsed_json.with_columns(
id= pl.int_range(0, pl.col("data").count())
)
print(ids)
shape: (500, 2)
┌────────────────┬─────┐
│ data           ┆ id  │
│ ---            ┆ --- │
│ list[u8]       ┆ i64 │
╞════════════════╪═════╡
│ [7, 5, … 7]    ┆ 0   │
│ [85, 73, … 90] ┆ 1   │
│ [81, 86, … 89] ┆ 2   │
│ [76, 26, … 96] ┆ 3   │
│ …              ┆ …   │
│ [11, 37, … 85] ┆ 496 │
│ [13, 51, … 94] ┆ 497 │
│ [18, 18, 18]   ┆ 498 │
│ [54, 60, … 98] ┆ 499 │
└────────────────┴─────┘
Подсчитайте все значения:

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

counts = ids.explode("data").group_by("id").agg(pl.col("data").value_counts(parallel=True)).explode("data").unnest("data")
print(counts)
shape: (18_157, 3)
┌─────┬──────┬────────┐
│ id  ┆ data ┆ counts │
│ --- ┆ ---  ┆ ---    │
│ i64 ┆ u8   ┆ u32    │
╞═════╪══════╪════════╡
│ 0   ┆ 48   ┆ 2      │
│ 0   ┆ 42   ┆ 4      │
│ 0   ┆ 84   ┆ 2      │
│ 0   ┆ 67   ┆ 2      │
│ …   ┆ …    ┆ …      │
│ 499 ┆ 24   ┆ 2      │
│ 499 ┆ 56   ┆ 2      │
│ 499 ┆ 60   ┆ 2      │
│ 499 ┆ 54   ┆ 3      │
└─────┴──────┴────────┘
Получить нечетное количество:

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

find_odds = counts.group_by("id").agg(pl.col("data").filter(pl.col("counts").mod(2) == 1))
print(find_odds)
shape: (500, 2)
┌─────┬──────────┐
│ id  ┆ data     │
│ --- ┆ ---      │
│ i64 ┆ list[u8] │
╞═════╪══════════╡
│ 0   ┆ [5]      │
│ 1   ┆ [85]     │
│ 2   ┆ [51]     │
│ 3   ┆ [43]     │
│ …   ┆ …        │
│ 496 ┆ [5]      │
│ 497 ┆ [57]     │
│ 498 ┆ [18]     │
│ 499 ┆ [54]     │
└─────┴──────────┘
В список:

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

result = find_odds.explode("data").get_column("data").to_list()
print(result)
[5, 85, 51, ..., 18, 54]
  • Полный пример файла
  • Ответы
Это единственный способ, которым я смог понять, как применять value_counts к списку списков, но опять же, похоже, что это очень неоптимально.

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

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

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

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

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

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