Jak filtrować wiersze zawierające wzór łańcucha z ramki danych Pandy [duplicate]
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
4 answers
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
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 obiektdf['ids']
jest typupandas.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ącychTrue
lubFalse
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.
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
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
.
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