Подавить один CSV-файл против другого, где значения содержат определенные строки - PullRequest
0 голосов
/ 10 июня 2018

Я пытаюсь удалить все строки в file1.csv, которые содержат строки из file2.csv с помощью python.Я хочу, чтобы он выполнил поиск всех значений в column1 файла file1.csv и удалил целые строки, где column1 содержит в своем значении ту же строку, что и file2.csv.

Я знаю, что grep -v в bash может сделать то же самоетолько с одной командой.Однако мне нужно подавить file1.csv против более 40000 возможных строк в file2.csv.Bash работает вечно и даже падает при выполнении этой команды.

Кто-нибудь знает надежный сценарий, который может делать то же, что и grep -v в python, но при подавлении файла с тысячами строк?

Просто чтобы убедиться, что все ясно:

File1.csv:

column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14

File2.csv:

column1
i4x

File3.csv:

column1,column2,column3
www.vfekjfwo11k.com,772,100
www.tum33kkwfl.com,1100,2

Но, опять же, мне это нужно в python, потому что число строк в file2.csv превышает 40000.

1 Ответ

0 голосов
/ 10 июня 2018

Одним из решений, которое может подойдет для вашего варианта использования, является сторонняя библиотека Pandas + regex.

Однако я настоятельно рекомендую вам использовать более эффективный алгоритм, например тот, который реализуетоснованный на trie Aho-Corasick , такой как это решение .

import pandas as pd
from io import StringIO

mystr1 = StringIO("""column1,column2,column3
www.gamai4xheifw.com,4410,22
www.vfekjfwo11k.com,772,100
www.gosi4xnbdn.com,1793,39
www.tum33kkwfl.com,1100,2
www.eei4xelwf.com,9982,14""")

mystr2 = StringIO("""column1
i4x""")

# read files, replace mystr1 / mystr2 with 'File1.csv' / 'File2.csv'
df = pd.read_csv(mystr1)
df_filter = pd.read_csv(mystr2)

# create regex string from filter values
str_filter = '|'.join(df_filter['column1'])

# apply filtering
df = df[~df['column1'].str.contains(str_filter)]

# export back to csv
df.to_csv('file_out.csv', index=False)

print(df)

               column1  column2  column3
1  www.vfekjfwo11k.com      772      100
3   www.tum33kkwfl.com     1100        2
...