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

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

Сообщение Anonymous »

Я хочу удалить все строки фрейма данных, которые соответствуют одной или нескольким строкам в фрейме данных фильтрации.
Да, я знаю о фильтрации по одному регулярному выражению, а также знаю, как можно использовать соединение, когда в столбце есть полное совпадение. Это не прямое совпадение, за исключением зацикливания кадра данных фильтра построчно.
Это относительно тривиальная проблема в sql — массовое применение этого фильтра на сервере без цикла с кодом на стороне клиента:
данное:
data.csv
filename,col2
keep.txt,bar
skip.txt,foo
keep2.txt,zoom
skip3.txt,custom1
discard.txt,custom2
file3.txt,custom3
discard2.txt,custom4
file4.txt,custom5

filter.csv:
skip
discard
skip

Вот SQL с использованием postgres. Он будет, и это ключевой момент, очень хорошо масштабироваться.
withsql.sql
\c test;

DROP TABLE IF EXISTS data;
DROP TABLE IF EXISTS filter;

CREATE TABLE data (
filename CHARACTER(50),
col2 CHARACTER(10),
skip BOOLEAN DEFAULT FALSE
);

\copy data (filename,col2) FROM './data.csv' WITH (FORMAT CSV);

CREATE TABLE filter (
skip VARCHAR(20)
);

\copy filter FROM './filter.csv' WITH (FORMAT CSV);

update filter set skip = skip || '%';

update data set skip = TRUE where exists (select 1 from filter s where filename like s.skip);
delete from data where skip = TRUE;

select * from data;


psql -f withsql.sql
это дает результат:
You are now connected to database "test" as user "djuser".
...
UPDATE 4
DELETE 4
filename | col2 | skip
----------------------------------------------------+------------+------
filename | col2 | f
keep.txt | bar | f
keep2.txt | zoom | f
file3.txt | custom3 | f
file4.txt | custom5 | f
(5 rows)


Теперь я могу обойтись полярами, но единственное, о чем я могу думать, это использовать цикл в filter.csv:
withpolars.py
import polars as pl

df_data = pl.read_csv("data.csv")
df_filter = pl.read_csv("filter.csv")

for row in df_filter.iter_rows():
df_data = df_data.filter(~pl.col('filename').str.contains(row[0]))

print("data after:\n", df_data)


Вывод правильный, но я как-то делаю это без цикла? И... просто любопытно, как некоторые из этих подходов к массовому SQL сопоставляются с фреймами данных.
data after:
shape: (4, 2)
┌───────────┬─────────┐
│ filename ┆ col2 │
│ --- ┆ --- │
│ str ┆ str │
╞═══════════╪═════════╡
│ keep.txt ┆ bar │
│ keep2.txt ┆ zoom │
│ file3.txt ┆ custom3 │
│ file4.txt ┆ custom5 │
└───────────┴─────────┘



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

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

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

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

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

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