2015-07-27 10 views
7

Mam plik .csv zawierający informacje kontaktowe, które importuję jako ramkę danych pandy.Python/Pandy: Upuszczanie wierszy z ramki danych na dopasowaniu ciągów z listy

>>> import pandas as pd 
>>> 
>>> df = pd.read_csv('data.csv') 
>>> df.head() 

    fName lName     email title 
0 John Smith   [email protected]  CEO 
1 Joe Schmo  [email protected] Bagger 
2 Some Person [email protected] Clerk 

Po zaimportowaniu danych, chciałbym upuścić wiersze, w których jedno pole zawiera jeden z wielu podciągów na liście. Na przykład:

to_drop = ['Clerk', 'Bagger'] 

for i in range(len(df)): 
    for k in range(len(to_drop)): 
     if to_drop[k] in df.title[i]: 
      # some code to drop the rows from the data frame 

df.to_csv("results.csv") 

Jaki jest preferowany sposób na zrobienie tego w Pandach? Czy powinien to być nawet etap przetwarzania końcowego, czy też preferuje się go najpierw przefiltrować przed zapisaniem w ramce danych? Myślałem, że łatwiej będzie manipulować raz w obiekcie ramki danych.

+0

http: // chrisalbon. com/python/pandas_drop_column_containing_certain_string.html sprawdź to – FirebladeDan

Odpowiedz

17

Zastosowanie isin i przekazać swoją listę terminów, aby szukać można następnie neguje logiczną maskę korzystając ~ i będzie odfiltrować te wiersze:

In [6]: 

to_drop = ['Clerk', 'Bagger'] 
df[~df['title'].isin(to_drop)] 
Out[6]: 
    fName lName    email title 
0 John Smith [email protected] CEO 

Inną metodą jest dołączenie warunki więc staje się regex i użyć wektoryzowane str.contains:

In [8]: 

df[~df['title'].str.contains('|'.join(to_drop))] 
Out[8]: 
    fName lName    email title 
0 John Smith [email protected] CEO 

IMO będzie łatwiej i prawdopodobnie szybciej wykonać filtrowanie jako etap przetwarzania końcowego, ponieważ jeśli zdecydujesz się filtrować podczas czytania to jesteś ja trwale rosnąca ramka danych, która nie jest wydajna.

Alternatywnie można odczytać CSV w kawałkach, odfiltrować wiersze, których nie chcesz i dołączyć kawałki do csv wyjściowego

+0

Może użycie zestawu byłoby pomysłem? –

+0

@PadraicCunningham masz na myśli dla listy wyszukiwanych haseł, tak myślę, ale miałem nadzieję, że OP dostarcza listę unikalnych terminów, chyba że odnosisz się do czegoś innego – EdChum

+0

Tak, przeznaczone dla listy nazwisk. –

1

Innym sposobem przy użyciu query

In [961]: to_drop = ['Clerk', 'Bagger'] 

In [962]: df.query('title not in @to_drop') 
Out[962]: 
    fName lName    email title 
0 John Smith [email protected] CEO 
Powiązane problemy