Jak sprawdzić, czy łańcuch zawiera jeden z podłańcuchów na liście? [duplikat]

To pytanie ma już odpowiedź tutaj:

Czy istnieje jakaś funkcja, która byłaby odpowiednikiem kombinacji df.isin() i df[col].str.contains()?

Na przykład, powiedzmy, że mam serię s = pd.Series(['cat','hat','dog','fog','pet']), i chcę znaleźć wszystkie miejsca, w których s Zawiera którekolwiek z ['og', 'at'], chciałbym wszystko oprócz zwierzaka.

Mam rozwiązanie, ale jest raczej nieeleganckie:

searchfor = ['og', 'at']
found = [s.str.contains(x) for x in searchfor]
result = pd.DataFrame[found]
result.any()
Czy jest na to lepszy sposób?
Author: TylerH, 2014-10-26

2 answers

Jedną z opcji jest użycie znaku regex |, aby spróbować dopasować każdy podłańcuch w słowach Z Serii s (nadal używając str.contains).

Możesz skonstruować regex łącząc słowa w searchfor z |:

>>> searchfor = ['og', 'at']
>>> s[s.str.contains('|'.join(searchfor))]
0    cat
1    hat
2    dog
3    fog
dtype: object

Jak @AndyHayden zauważył w komentarzach poniżej, uważaj, czy podciągi mają znaki specjalne, takie jak $ i ^, które chcesz dopasować dosłownie. Znaki te mają określone znaczenia w kontekście wyrażeń regularnych i wpłynie na dopasowanie.

Możesz uczynić listę podłańcuchów bezpieczniejszymi, unikając znaków niealfanumerycznych za pomocą re.escape:

>>> import re
>>> matches = ['$money', 'x^y']
>>> safe_matches = [re.escape(m) for m in matches]
>>> safe_matches
['\\$money', 'x\\^y']

Ciągi znaków z tej nowej Listy będą pasowały do każdego znaku dosłownie, gdy zostaną użyte z str.contains.

 85
Author: Alex Riley,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-28 20:42:50

Możesz użyć str.contains samodzielnie ze wzorem regex używając OR (|):

s[s.str.contains('og|at')]

Lub możesz dodać serię do dataframe następnie użyć str.contains:

df = pd.DataFrame(s)
df[s.str.contains('og|at')] 

Wyjście:

0 cat
1 hat
2 dog
3 fog 
 25
Author: l'L'l,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-26 21:33:30