Коротко
- Строковые методы вызываются через
.str:s.str.lower(),s.str.contains("x"). Они работают с каждым значением и пропускаютNaN. - В pandas 3 строки по умолчанию хранятся в типе
str(раньше —object). contains,replace,split,extractпо умолчанию понимают регулярные выражения. Для поиска обычного текста —regex=False.split(expand=True)раскладывает части по столбцам;extract(r"(...)")достаёт группы шаблона.s.str[:4]— срез каждой строки,s.str.len()— длины.
Синтаксис
s.str.strip(), s.str.lower(), s.str.upper(), s.str.title()
s.str.contains(pat, case=True, regex=True, na=None)
s.str.startswith(prefix), s.str.endswith(suffix)
s.str.split(sep, n=-1, expand=False)
s.str.extract(r"(группа)", expand=True)
s.str.replace(pat, repl, regex=False)
s.str.len(), s.str[i:j], s.str.cat(sep=", ")Параметры
ПараметрЧто делаетПо умолчанию
patподстрока или регулярное выражениеобязательныйregexв contains — True, в replace — False: считать ли pat регулярным выражениемTrue / Falsecaseв contains: учитывать регистрTrueexpandв split / extract: вернуть DataFrame со столбцамиFalse / Truenв split: максимум разбиений-1 (все)Примеры
clients = pd.DataFrame({
"name": [" анна ПЕТРОВА", "Борис Иванов ", "вика сидорова", None],
"email": ["anna@mail.ru", "boris@yandex.ru", "vika@mail.ru", "x@gmail.com"],
"phone": ["+7 (912) 345-67-89", "8-912-111-22-33", "89125554433", "—"],
})clients["name"].str.strip().str.title()Вывод
0 Анна Петрова 1 Борис Иванов 2 Вика Сидорова 3 NaN Name: name, dtype: str
clients[clients["email"].str.contains("mail.ru", regex=False)]Вывод
name email phone 0 анна ПЕТРОВА anna@mail.ru +7 (912) 345-67-89 2 вика сидорова vika@mail.ru 89125554433
clients["email"].str.endswith("@mail.ru")Вывод
0 True 1 False 2 True 3 False Name: email, dtype: bool
clients["name"].str.strip().str.split(" ", expand=True) # в отдельные столбцыВывод
0 1 0 анна ПЕТРОВА 1 Борис Иванов 2 вика сидорова 3 NaN NaN
clients["email"].str.extract(r"@(\w+)\.") # группа регулярного выраженияВывод
0 0 mail 1 yandex 2 mail 3 gmail
clients["phone"].str.replace(r"\D", "", regex=True) # оставить только цифрыВывод
0 79123456789 1 89121112233 2 89125554433 3 Name: phone, dtype: str
print(clients["email"].str.len().tolist())
clients["email"].str[:4] # первые 4 символаВывод
[12, 15, 12, 11] 0 anna 1 bori 2 vika 3 x@gm Name: email, dtype: str
clients["name"].str.strip().str.cat(sep=", ") # склеить значения столбцаВывод
'анна ПЕТРОВА, Борис Иванов, вика сидорова'
Подводные камни
Точка и другие символы в регулярном выражении
В contains точка означает «любой символ». Для поиска текста как есть передайте regex=False.
clients["email"].str.contains(".ru").tolist() # «.» в регулярном выражении — любой символВывод
[True, True, True, False]
.str у нестроковых столбцов
pd.Series([1, 2]).str.len() # .str только для строкОшибка
AttributeError: Can only use .str accessor with string values, not integer
Сначала приведите к строкам: s.astype(str).str.len().
Пропуски в строковых методах
Методы, возвращающие строки, сохраняют NaN. А contains и startswith в типе str возвращают для пропуска False — строка с пропуском не попадёт в фильтр.
print(clients["name"].str.upper().tolist()) # пропуск остаётся пропуском
clients["name"].str.contains("ов").tolist() # а у contains для пропуска — FalseВывод
[' АННА ПЕТРОВА', 'БОРИС ИВАНОВ ', 'ВИКА СИДОРОВА', nan] [False, True, True, False]