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.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.
foo[foo.b.str.startswith("f")]
zadziała.