Я хотел бы чисто отфильтровать фрейм данных с помощью регулярных выражений в одном из столбцов.
Для надуманного примера:
In [210]: foo = pd.DataFrame({'a' : [1,2,3,4], 'b' : ['hi', 'foo', 'fat', 'cat']})
In [211]: foo
Out[211]:
a b
0 1 hi
1 2 foo
2 3 fat
3 4 cat
Я хочу отфильтровать строки с теми, которые начинаются с f
использованием регулярных выражений. Сначала идите:
In [213]: foo.b.str.match('f.*')
Out[213]:
0 []
1 ()
2 ()
3 []
Это не слишком ужасно полезно. Однако это даст мне мой логический индекс:
In [226]: foo.b.str.match('(f.*)').str.len() > 0
Out[226]:
0 False
1 True
2 True
3 False
Name: b
Поэтому я мог бы сделать свое ограничение:
In [229]: foo[foo.b.str.match('(f.*)').str.len() > 0]
Out[229]:
a b
1 2 foo
2 3 fat
Это заставляет меня искусственно помещать группу в регулярное выражение, и кажется, что, возможно, это не самый верный путь. Есть лучший способ сделать это?
foo[foo.b.str.startswith("f")]
будет работать.foo[foo.b.str.match('(f.*)').str.len() > 0]
, это довольно хорошее решение! Более настраиваемый и полезный, чем начальный с, потому что он содержит в себе универсальность регулярных выражений.foo[foo.b.str.match('f.*')]
меня линия работает в пандах 0.24.2.Ответы:
Используйте вместо этого содержит :
источник
df.loc[df.b.str.contains('^f'), :]
df[df.b.str.contains('^f'), :]
Уже есть функция обработки строк
Series.str.startswith()
. Ты должен попробоватьfoo[foo.b.str.startswith('f')]
.Результат:
Я думаю, что вы ожидаете.
В качестве альтернативы вы можете использовать параметр «содержит регулярные выражения». Например:
Результат:
na=False
предотвратить ошибки в случае, если есть значения nan, null и т. д.источник
df[~df.CITY.str.contains('~.*', regex= True, na=False)]
Поиск по нескольким столбцам с фреймом данных:
источник
frame
? а'C:\test\test.txt'
? Похоже, вы отвечаете на другой вопрос.Это может быть немного поздно, но теперь это легче сделать в Пандах. Вы можете вызвать матч с,
as_indexer=True
чтобы получить логические результаты. Это задокументировано (вместе с разницей междуmatch
иcontains
) здесь .источник
Спасибо за отличный ответ @ user3136169, вот пример того, как это можно сделать, также удаляя значения NoneType.
Также вы можете также добавить регулярное выражение в качестве аргумента:
источник
Напишите булеву функцию, которая проверяет регулярное выражение и используйте команду apply в столбце.
источник
Используя
str
ломтикисточник