2013-03-10 14 views
72

Chciałbym wyczyścić filtrowanie ramki danych za pomocą wyrażeń regularnych w jednej z kolumn.Jak odfiltrować wiersze w pandach przez regex

na dobry przykład:

In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']}) 
In [211]: foo 
Out[211]: 
    a b 
0 1 hi 
1 2 foo 
2 3 fat 
3 4 cat 

chcę odfiltrować wiersze do tych, które zaczynają się f za pomocą wyrażenia regularnego. Najpierw:

In [213]: foo.b.str.match('f.*') 
Out[213]: 
0 [] 
1 () 
2 () 
3 [] 

To niezbyt użyteczne. Jednak to dostanie mi logiczną index:

In [226]: foo.b.str.match('(f.*)').str.len() > 0 
Out[226]: 
0 False 
1  True 
2  True 
3 False 
Name: b 

Więc mogłem wtedy zrobić mój ograniczenie przez:

In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0] 
Out[229]: 
    a b 
1 2 foo 
2 3 fat 

to sprawia, że ​​sztucznie umieścić grupy w regex, choć i wydaje się może nie czysty sposób, aby przejść. Czy jest lepszy sposób to zrobić?

+3

Jeśli nie przywiązane do regexes, 'foo [foo.b.str.startswith ("f")] 'zadziała. – DSM

+0

IMHO Myślę, że 'foo [foo.b.str.match ('(f. *)'). Str.len()> 0]' jest dość dobrym rozwiązaniem! Bardziej konfigurowalny i użyteczny niż startswith, ponieważ zawiera w sobie wszechstronność regexu. –

Odpowiedz

91

Zastosowanie contains zamiast:

In [10]: df.b.str.contains('^f') 
Out[10]: 
0 False 
1  True 
2  True 
3 False 
Name: b, dtype: bool 
+5

Jak można odwrócić wartość boolowską? Znalazłem: http://stackoverflow.com/questions/15998188/how-can-i-obtain-the-element-wise-logical-not-of-a-andres-series – dmeu

13

wyszukiwania kolumna Wiele z dataframe:

frame[frame.filename.str.match('*.'+MetaData+'.*') & frame.file_path.str.match('C:\test\test.txt')] 
+0

'frame'? i '' C: \ test \ test.txt''? Wygląda na to, że odpowiadasz na inne pytanie. –

+0

ramka jest df. jest związany z tym samym pytaniem, ale odpowiada w jaki sposób filtrować wiele kolumn ("filename" i "file_path") w jednym kodzie wiersza. –

6

To może być trochę późno, ale to jest teraz łatwiejsze do zrobienia w Pand. Możesz połączyć mecz z as_indexer=True, aby uzyskać wyniki boolowskie. Jest to udokumentowane (wraz z różnicą między match i contains) here.

5

Istnieje już funkcja obsługi ciągów znaków Series.str.startwith().

Powinieneś spróbować foo[foo.b.str.startswith('f')].

Wynik:

a b 
1 2 foo 
2 3 fat 

myślę, czego oczekujesz.

0

napisać boolian funkcję, która sprawdza regex i wykorzystanie stosować na kolumnie

foo [foo [ 'b']. Zastosowania (regex_function)]