Chciałbym czysto przefiltrować ramkę danych za pomocą wyrażenia regularnego w jednej z kolumn.
Oto wymyślony 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ę przefiltrować wiersze do tych, które zaczynają się f
od wyrażenia regularnego. Pierwsze podejście:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
To niezbyt przydatne. Jednak w ten sposób otrzymam mój indeks logiczny:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Mogłem więc zrobić moje ograniczenie poprzez:
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 umieszczam grupę w wyrażeniu regularnym i wydaje się, że może nie jest to czysta droga. Czy jest lepszy sposób na zrobienie tego?
foo[foo.b.str.startswith("f")]
zadziała.foo[foo.b.str.match('(f.*)').str.len() > 0]
to całkiem dobre rozwiązanie! Bardziej konfigurowalny i przydatny niż startedwith, ponieważ zawiera w sobie wszechstronność wyrażenia regularnego.foo[foo.b.str.match('f.*')]
działa w pandach 0.24.2 dla mnie.Odpowiedzi:
Zamiast tego użyj zawiera :
źródło
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Istnieje już funkcja obsługująca ciąg
Series.str.startswith()
. Powinieneś spróbowaćfoo[foo.b.str.startswith('f')]
.Wynik:
Myślę, czego oczekujesz.
Alternatywnie możesz użyć zawiera z opcją regex. Na przykład:
Wynik:
na=False
ma na celu zapobieganie błędom w przypadku wartości nan, null itpźródło
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Wyszukiwanie w wielu kolumnach z ramką danych:
źródło
frame
? i'C:\test\test.txt'
? Wygląda na to, że odpowiadasz na inne pytanie.Może to być trochę za późno, ale teraz jest to łatwiejsze do zrobienia na Pandach. Możesz wywołać match z,
as_indexer=True
aby uzyskać wyniki logiczne. Jest to udokumentowane (wraz z różnicą międzymatch
icontains
) tutaj .źródło
Dzięki za świetną odpowiedź @ user3136169, oto przykład tego, jak można to zrobić również usuwając wartości NoneType.
Możesz również dodać wyrażenie regularne jako argument:
źródło
Napisz funkcję boolowską, która sprawdza wyrażenie regularne i użyj zastosuj na kolumnie
źródło
Za pomocą
str
plasterkaźródło