Mam DataFrame
z 4 kolumnami, z których 2 zawierają wartości ciągu. Zastanawiałem się, czy istnieje sposób na wybranie wierszy na podstawie częściowego dopasowania ciągu do konkretnej kolumny?
Innymi słowy, funkcja lub funkcja lambda, która zrobiłaby coś podobnego
re.search(pattern, cell_in_question)
zwracanie wartości logicznej. Znam składnię, df[df['A'] == "hello world"]
ale nie mogę znaleźć sposobu, aby zrobić to samo z powiedzeniem częściowego dopasowania ciągu 'hello'
.
Czy ktoś byłby w stanie skierować mnie we właściwym kierunku?
df[df['A'].str.contains("Hello|Britain")]
.str.contains
na.query()
interfejs API ?df[df['value'].astype(str).str.contains('1234.+')]
do odfiltrowywania kolumn nie łańcuchowych.Wypróbowałem powyższe rozwiązanie:
i dostał błąd:
możesz przekształcić wartości NA w
False
następujący sposób:źródło
df[df['A'].astype(str).str.contains("Hello|Britain")]
pracował równieżTen post jest przeznaczony dla czytelników, którzy chcą
isin
)... i chciałbym dowiedzieć się więcej o tym, jakie metody powinny być preferowane w stosunku do innych.
(PS: Widziałem wiele pytań na podobne tematy, pomyślałem, że dobrze byłoby zostawić to tutaj.)
Podstawowe wyszukiwanie podciągów
str.contains
może być używany do wyszukiwania podłańcuchów lub wyszukiwania opartego na wyrażeniach regularnych. Domyślnie wyszukiwanie jest oparte na wyrażeniach regularnych, chyba że zostanie to jawnie wyłączone.Oto przykład wyszukiwania opartego na wyrażeniach regularnych,
Czasami wyszukiwanie wyrażeń regularnych nie jest wymagane, więc
regex=False
należy je wyłączyć.Pod względem wydajności wyszukiwanie wyrażeń regularnych jest wolniejsze niż wyszukiwanie podciągów:
Unikaj wyszukiwania opartego na wyrażeniach regularnych, jeśli go nie potrzebujesz.
Adresowanie
ValueError
sCzasami, wykonując podciąg przeszukiwanie i filtrowanie na wynik spowoduje
Wynika to zwykle z mieszanych danych lub NaN w kolumnie obiektu,
Wszystko, co nie jest łańcuchem, nie może mieć na nim metod łańcuchowych, więc wynikiem jest NaN (naturalnie). W takim przypadku określ
na=False
ignorowanie danych nieciągłych,Wyszukiwanie wielu podciągów
Najłatwiej to osiągnąć poprzez wyszukiwanie wyrażeń regularnych za pomocą potoku OR wyrażenia regularnego.
Możesz także utworzyć listę warunków, a następnie dołączyć do nich:
Czasami rozsądnie jest uciec od terminów, na wypadek gdyby zawierały znaki, które można interpretować jako metaznaki regularne . Jeśli Twoje warunki zawierają jeden z następujących znaków ...
Następnie musisz użyć ich,
re.escape
aby uciec :re.escape
powoduje ucieczkę od znaków specjalnych, więc są one traktowane dosłownie.Pasujące całe słowa
Domyślnie wyszukiwanie podciągów szuka określonego podciągu / wzorca bez względu na to, czy jest to pełne słowo, czy nie. Aby dopasować tylko pełne słowa, będziemy musieli użyć tutaj wyrażeń regularnych - w szczególności nasz wzorzec będzie musiał określać granice słów (
\b
).Na przykład,
Teraz rozważ
vs
Wyszukiwanie wielu słów
Podobnie jak powyżej, z tym wyjątkiem, że
\b
do połączonego wzorca dodajemy słowo granica ( ).Gdzie
p
tak wyglądaŚwietna alternatywa: skorzystaj z listy !
Ponieważ możesz! I powinieneś! Zazwyczaj są one nieco szybsze niż metody łańcuchowe, ponieważ metody łańcuchowe są trudne do wektoryzacji i zwykle mają implementacje pętli.
Zamiast,
Użyj
in
operatora wewnątrz listy,Zamiast,
Użyj
re.compile
(do buforowania wyrażenia regularnego) +Pattern.search
wewnątrz listy,Jeśli „col” ma NaN, to zamiast
Posługiwać się,
Więcej opcji dopasowanie częściowe wyrażenie:
np.char.find
,np.vectorize
,DataFrame.query
.Oprócz wyrażeń
str.contains
i listy możesz także skorzystać z poniższych alternatyw.np.char.find
Obsługuje tylko wyszukiwanie podciągów (odczyt: brak wyrażenia regularnego).
np.vectorize
Jest to opakowanie wokół pętli, ale z mniejszym narzutem niż większość
str
metod pand .Możliwe rozwiązania Regex:
DataFrame.query
Obsługuje metody łańcuchowe za pośrednictwem silnika python. Nie zapewnia to widocznych korzyści w zakresie wydajności, ale mimo to warto wiedzieć, czy trzeba dynamicznie generować zapytania.
Więcej informacji na temat
query
ieval
rodzina metod można znaleźć w Dynamiczna Expression Oceny w pand użyciu pd.eval () .Zalecane użycie Priorytet
str.contains
, ze względu na prostotę i łatwość obsługi NaN i danych mieszanychnp.vectorize
df.query
źródło
any(needle in haystack for needling in ['foo', 'bar'] and haystack in (df['col'], df['col2']))
i odmiany próbowałem zadławić się (narzekaany()
i słusznie tak ... Ale doktor jest błogo niejasny, jak zrobić takie zapytanie.df[['col1', 'col2']].apply(lambda x: x.str.contains('foo|bar')).any(axis=1)
Jeśli ktoś zastanawia się, jak wykonać podobny problem: „Wybierz kolumnę według ciągu częściowego”
Posługiwać się:
Aby wybrać wiersze według częściowego dopasowania ciągu, przekaż
axis=0
do filtru:źródło
df.loc[:, df.columns.str.contains('a')]
df.filter(like='a')
Szybka uwaga: jeśli chcesz dokonać wyboru na podstawie częściowego ciągu znaków zawartego w indeksie, spróbuj wykonać następujące czynności:
źródło
Powiedz, że masz następujące elementy
DataFrame
:Zawsze możesz użyć
in
operatora w wyrażeniu lambda, aby utworzyć swój filtr.Sztuczka polega na tym, aby użyć
axis=1
opcji wapply
celu przekazania elementów do funkcji lambda rząd po rzędzie, w przeciwieństwie do kolumn po kolumnie.źródło
Oto, co skończyłem dla częściowych dopasowań ciągów. Jeśli ktoś ma bardziej skuteczny sposób na zrobienie tego, proszę dać mi znać.
źródło
Używanie zawiera nie działało dobrze dla mojego ciągu znaków specjalnych. Znajdź działało.
źródło
Przed tym są odpowiedzi, które spełniają zadaną funkcję, w każdym razie chciałbym pokazać najbardziej ogólnie:
W ten sposób uzyskamy kolumnę, której szukasz, niezależnie od tego, jak jest napisane.
(Oczywiście, musisz napisać właściwe wyrażenie regularne dla każdego przypadku)
źródło
Może chcesz wyszukać tekst we wszystkich kolumnach ramki danych Pandy, a nie tylko w ich podzbiorze. W takim przypadku pomoże następujący kod.
Ostrzeżenie. Ta metoda jest stosunkowo powolna, aczkolwiek wygodna.
źródło
Jeśli konieczne jest wyszukiwanie łańcucha bez rozróżniania wielkości liter w kolumnie ramki danych pandy:
źródło