Ответ 1
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
Предположим, что у нас есть кадр данных в Python Pandas, который выглядит так:
df = pd.DataFrame({'vals': [1, 2, 3, 4], 'ids': [u'aball', u'bball', u'cnut', u'fball']})
Или в виде таблицы:
ids vals
aball 1
bball 2
cnut 3
fball 4
Как фильтровать строки, содержащие ключевое слово "ball?"? Например, выход должен быть:
ids vals
aball 1
bball 2
fball 4
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1
Пошаговое объяснение (от внутреннего к внешнему):
df['ids']
выбирает столбец ids
фрейма данных (технически объект df['ids']
имеет тип pandas.Series
)df['ids'].str
позволяет нам применять векторизованные строковые методы (например, lower
, contains
) к Серииdf['ids'].str.contains('ball')
проверяет каждый элемент Серии на df['ids'].str.contains('ball')
наличия в значении элемента строки 'ball' в качестве подстроки. В результате серии Booleans индикации True
или False
о существовании "шара" подстроки.df[df['ids'].str.contains('ball')]
применяет логическую "маску" к фрейму данных и возвращает представление, содержащее соответствующие записи.na = False
удаляет значения NA/NaN из рассмотрения; в противном случае ValueError может быть возвращено.>>> 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
Если вы хотите установить столбец, по .filter
вы фильтруете, как новый индекс, вы также можете использовать .filter
; если вы хотите сохранить его как отдельный столбец, тогда str.contains
- это путь.
Скажем у вас есть
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
и ваш план состоит в том, чтобы отфильтровать все строки, в которых ids
содержат ball
И установить ids
качестве нового индекса, вы можете сделать
df.set_index('ids').filter(like='ball', axis=0)
который дает
vals
ids
aball 1
bball 2
fball 4
ballxyz 5
Но filter
также позволяет передавать регулярное выражение, поэтому вы также можете фильтровать только те строки, где запись в столбце заканчивается ball
. В этом случае вы используете
df.set_index('ids').filter(regex='ball$', axis=0)
vals
ids
aball 1
bball 2
fball 4
Обратите внимание, что теперь запись с ballxyz
не включена, так как она начинается с ball
и не заканчивается на нем.
Если вы хотите получить все записи, которые начинаются с ball
вы можете просто использовать
df.set_index('ids').filter(regex='^ball', axis=0)
получая
vals
ids
ballxyz 5
То же самое работает с колонками; все, что вам нужно изменить, это axis=0
часть. Если вы фильтруете по столбцам, это будет axis=1
.