Подтвердить что ты не робот

Как фильтровать строки, содержащие шаблон строки из Pandas dataframe

Предположим, что у нас есть кадр данных в 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
4b9b3361

Ответ 1

In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
     ids  vals
0  aball     1
1  bball     2
3  fball     4

Ответ 2

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 может быть возвращено.

Ответ 3

>>> 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

Ответ 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.