Я хочу удалить все строки фрейма данных, которые соответствуют одной или нескольким строкам в фрейме данных фильтрации.
Да, я знаю о фильтрации по одному регулярному выражению, а также знаю, как можно использовать соединение, когда в столбце есть полное совпадение. Это не прямое совпадение, за исключением зацикливания кадра данных фильтра построчно.
Это относительно тривиальная проблема в 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
Как я могу отфильтровать все строки кадра данных Polars, которые частично соответствуют строкам в другом? ⇐ Python
Программы на Python
1761902758
Anonymous
Я хочу удалить все строки фрейма данных, которые соответствуют одной или нескольким строкам в фрейме данных фильтрации.
Да, я знаю о фильтрации по [b]одному[/b] регулярному выражению, а также знаю, как можно использовать соединение, когда в столбце есть полное совпадение. Это не прямое совпадение, за исключением зацикливания кадра данных фильтра построчно.
Это относительно тривиальная проблема в 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 │
└───────────┴─────────┘
Подробнее здесь: [url]https://stackoverflow.com/questions/78098472/how-can-i-filter-all-rows-of-a-polars-dataframe-that-partially-match-strings-in[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия