Как правильно извлечь все повторяющиеся строки в кадре данных Polars с дополнительным условием?Python

Программы на Python
Ответить
Anonymous
 Как правильно извлечь все повторяющиеся строки в кадре данных Polars с дополнительным условием?

Сообщение Anonymous »

При наличии фрейма данных Polars я хочу извлечь все повторяющиеся строки, одновременно применяя дополнительное условие фильтра, например:

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

import polars as pl

df = pl.DataFrame({
"name": ["Alice", "Bob", "Alice", "David", "Eve", "Bob", "Frank"],
"city": ["NY", "LA", "NY", "SF", "LA", "LA", "NY"],
"age": [25, 30, 25, 35, 28, 30, 40]
})

# Trying this:
df.filter((df.is_duplicated()) & (pl.col("city") == "NY"))  # error
Однако это приводит к ошибке:

SchemaError: невозможно распаковать серию объектов типа в bool

Это намекает на то, что df.is_duulated() возвращает серию объектов типа, но на самом деле это логическое значение Серия.
Удивительно, но переупорядочение предикатов путем размещения выражения первым заставляет его работать (но почему?):

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

df.filter((pl.col("city") == "NY") & (df.is_duplicated()))  # works!
правильно выводит:

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

shape: (2, 3)
┌───────┬──────┬─────┐
│ name  ┆ city ┆ age │
│ ---   ┆ ---  ┆ --- │
│ str   ┆ str  ┆ i64 │
╞═══════╪══════╪═════╡
│ Alice ┆ NY   ┆ 25  │
│ Alice ┆ NY   ┆ 25  │
└───────┴──────┴─────┘
Я понимаю, что оптимальным подходом при фильтрации дубликатов на основе подмножества столбцов является использование pl.struct, например:

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

df.filter((pl.struct(df.columns).is_duplicated()) & (pl.col("city") == "NY"))  # works
Это отлично работает с дополнительным условием фильтра.
Однако я намеренно не использую pl.struct, поскольку мой реальный фрейм данных имеет 40 столбцов, и я хочу проверить наличие повторяющихся строк на основе всех столбцов, кроме трех, поэтому я сделал следующее:

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

df.filter(df.drop("col1", "col2", "col3").is_duplicated())
Это прекрасно работает и гораздо удобнее, чем писать все 37 столбцов в pl.struct. Однако это нарушается при добавлении дополнительного условия фильтра справа, но не слева:

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

df.filter(
(df.drop("col1", "col2", "col3").is_duplicated()) & (pl.col("col5") == "something")
)  # breaks!

df.filter(
(pl.col("col5") == "something") & (df.drop("col1", "col2", "col3").is_duplicated())
)  # works!
Почему порядок предикатов (серия и выражение против выражения и серии) имеет значение внутри .filter() в этом случае?
Это задуманное поведение в Polars или ошибка?


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

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

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

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

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

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