Jak filtrować wiersze zawierające wzór łańcucha z ramki danych Pandy [duplicate]

to pytanie ma już odpowiedzi tutaj : Select by partial string from a pandas DataFrame (11 odpowiedzi) Zamknięty 2 lata temu .

Załóżmy, że mamy ramkę danych w Pythonie, która wygląda tak:

df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})

Lub w formie tabeli:

ids    vals
aball   1
bball   2
cnut    3
fball   4

Jak filtrować wiersze zawierające słowo kluczowe " piłka?"Na przykład wyjście powinno być:

ids    vals
aball   1
bball   2
fball   4
Author: Cleb, 2015-01-15

4 answers

In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
     ids  vals
0  aball     1
1  bball     2
3  fball     4
 355
Author: Amit Verma,
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
2015-01-15 23:59:55
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1

Wyjaśnienie krok po kroku (od wewnętrznej do zewnętrznej):

  • df['ids'] wybiera kolumnę ids ramki danych (technicznie obiekt df['ids'] jest typu pandas.Series)
  • df['ids'].str pozwala na zastosowanie wektoryzowanych metod łańcuchowych (np., lower, contains) do serii
  • df['ids'].str.contains('ball') sprawdza każdy element serii, czy wartość elementu ma łańcuch "ball" jako podłańcuch. Wynikiem jest szereg Booleanów wskazujących True lub False na temat istnienia z podkładu "kulkowego".
  • df[df['ids'].str.contains('ball')] stosuje "maskę" logiczną do ramki danych i zwraca widok zawierający odpowiednie rekordy.
  • na = False usuwa wartości NA / NaN z analizy; w przeciwnym razie może zostać zwrócony ValueError.
 109
Author: Jubbles,
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
2019-04-21 03:23:12
>>> mask = df['ids'].str.contains('ball')    
>>> mask
0     True
1     True
2    False
3     True
Name: ids, dtype: bool

>>> df[mask]
     ids  vals
0  aball     1
1  bball     2
3  fball     4
 16
Author: user3820991,
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
2015-01-15 23:56:36

Jeśli chcesz ustawić kolumnę filtrowaną jako nowy indeks, możesz również rozważyć użycie .filter; jeśli chcesz zachować go jako oddzielną kolumnę, to str.contains jest dobrym rozwiązaniem.

Powiedzmy, że masz

df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']})

       ids  vals
0    aball     1
1    bball     2
2     cnut     3
3    fball     4
4  ballxyz     5

A twoim planem jest filtrowanie wszystkich wierszy, w których ids zawiera ball i ustawianie ids jako nowego indeksu, możesz zrobić

df.set_index('ids').filter(like='ball', axis=0)

Co daje

         vals
ids          
aball       1
bball       2
fball       4
ballxyz     5

Ale filter pozwala również przekazać regex, więc można filtrować tylko te wiersze, w których wpis w kolumnie kończy się znakiem ball. W tym przypadku używasz

df.set_index('ids').filter(regex='ball$', axis=0)

       vals
ids        
aball     1
bball     2
fball     4

Zauważ, że teraz wpis z ballxyz nie jest uwzględniony, ponieważ zaczyna się od ball i nie kończy się na nim.

Jeśli chcesz uzyskać wszystkie wpisy zaczynające się od ball możesz w prosty sposób użyć

df.set_index('ids').filter(regex='^ball', axis=0)

         vals
ids          
ballxyz     5

To samo działa z kolumnami; wszystko, co musisz zmienić, to część axis=0. Jeśli filtrujesz na podstawie kolumn, będzie to axis=1.

 9
Author: Cleb,
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-12-12 09:37:28