In [1]: import pandas as pd
- данные Titanic
Этот учебник использует набор данных Titanic, сохраненный как CSV. Данные состоят из следующих столбцов данных:
PassengerId: Идентификатор каждого пассажира.
Выжил: Указание, выжил ли пассажир.
0для да и1для нет.Pclass: Один из 3 классов билетов: Класс
1, Класс2и Класс3.Name: Имя пассажира.
Sex: Пол пассажира.
Age: Возраст пассажира в годах.
SibSp: Количество братьев, сестер или супругов на борту.
Parch: Количество родителей или детей на борту.
Ticket: Номер билета пассажира.
Fare: Указывает стоимость проезда.
Cabin: Номер каюты пассажира.
Embarked: Порт посадки.
In [2]: titanic = pd.read_csv("data/titanic.csv") In [3]: titanic.head() Out[3]: PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 1 2 1 1 ... 71.2833 C85 C 2 3 1 3 ... 7.9250 NaN S 3 4 1 1 ... 53.1000 C123 S 4 5 0 3 ... 8.0500 NaN S [5 rows x 12 columns]
Как работать с текстовыми данными#
Сделать все символы имени строчными.
In [4]: titanic["Name"].str.lower() Out[4]: 0 braund, mr. owen harris 1 cumings, mrs. john bradley (florence briggs th... 2 heikkinen, miss. laina 3 futrelle, mrs. jacques heath (lily may peel) 4 allen, mr. william henry ... 886 montvila, rev. juozas 887 graham, miss. margaret edith 888 johnston, miss. catherine helen "carrie" 889 behr, mr. karl howell 890 dooley, mr. patrick Name: Name, Length: 891, dtype: object
Чтобы сделать каждую из строк в
Nameстолбец в нижнем регистре, выберитеNameстолбца (см. руководство по выбору данных), добавьтеstrаксессор и применитьlowerметод. Таким образом, каждая из строк преобразуется поэлементно.
Аналогично объектам datetime в руководство по временным рядам
имеющий dt аксессор, ряд
специализированных строковых методов доступен при использовании str
аксессор. Эти методы, как правило, имеют совпадающие названия с эквивалентными встроенными строковыми методами для отдельных элементов, но применяются поэлементно (помните поэлементные вычисления?)
на каждом из значений столбцов.
Создать новый столбец
Surnameкоторая содержит фамилии пассажиров, извлекая часть перед запятой.In [5]: titanic["Name"].str.split(",") Out[5]: 0 [Braund, Mr. Owen Harris] 1 [Cumings, Mrs. John Bradley (Florence Briggs ... 2 [Heikkinen, Miss. Laina] 3 [Futrelle, Mrs. Jacques Heath (Lily May Peel)] 4 [Allen, Mr. William Henry] ... 886 [Montvila, Rev. Juozas] 887 [Graham, Miss. Margaret Edith] 888 [Johnston, Miss. Catherine Helen "Carrie"] 889 [Behr, Mr. Karl Howell] 890 [Dooley, Mr. Patrick] Name: Name, Length: 891, dtype: object
Используя
Series.str.split()метод, каждое из значений возвращается как список из 2 элементов. Первый элемент — это часть до запятой, а второй элемент — часть после запятой.In [6]: titanic["Surname"] = titanic["Name"].str.split(",").str.get(0) In [7]: titanic["Surname"] Out[7]: 0 Braund 1 Cumings 2 Heikkinen 3 Futrelle 4 Allen ... 886 Montvila 887 Graham 888 Johnston 889 Behr 890 Dooley Name: Surname, Length: 891, dtype: object
Поскольку нас интересует только первая часть, представляющая фамилию (элемент 0), мы снова можем использовать
strаксессор и применитьSeries.str.get()для извлечения соответствующей части. Действительно, эти строковые функции можно объединять для комбинирования нескольких функций одновременно!
Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя разделение и замена строк.
Извлеките данные о пассажирах-графинях на борту Титаника.
In [8]: titanic["Name"].str.contains("Countess") Out[8]: 0 False 1 False 2 False 3 False 4 False ... 886 False 887 False 888 False 889 False 890 False Name: Name, Length: 891, dtype: bool
In [9]: titanic[titanic["Name"].str.contains("Countess")] Out[9]: PassengerId Survived Pclass ... Cabin Embarked Surname 759 760 1 1 ... B77 S Rothes [1 rows x 13 columns]
(Интересна её история? Смотрите Википедия!)
Строковый метод
Series.str.contains()проверяет каждое из значений в столбцеNameесли строка содержит словоCountessи возвращает для каждого из значенийTrue(Countessявляется частью имени) илиFalse(Countessне является частью имени). Этот вывод можно использовать для выбора подмножества данных с помощью условного (булевого) индексирования, представленного в руководство по выборке данных. Поскольку на Титанике была только одна графиня, мы получаем одну строку в результате.
Примечание
Поддерживаются более мощные извлечения из строк, так как
Series.str.contains() и Series.str.extract() методы принимают регулярные
выражения, но выходит за рамки данного руководства.
Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя сопоставление и извлечение строк.
У какого пассажира Титаника самое длинное имя?
In [10]: titanic["Name"].str.len() Out[10]: 0 23 1 51 2 22 3 44 4 24 .. 886 21 887 28 888 40 889 21 890 19 Name: Name, Length: 891, dtype: int64
Чтобы получить самое длинное имя, сначала нужно получить длины каждого из имен в
Nameстолбец. Используя строковые методы pandas,Series.str.len()функция применяется к каждому из имен индивидуально (поэлементно).In [11]: titanic["Name"].str.len().idxmax() Out[11]: 307
Далее нам нужно получить соответствующую позицию, предпочтительно метку индекса, в таблице, для которой длина имени наибольшая. Функция
idxmax()метод делает именно это. Это не строковый метод и применяется к целым числам, поэтому нетstrиспользуется.In [12]: titanic.loc[titanic["Name"].str.len().idxmax(), "Name"] Out[12]: 'Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)'
На основе имени индекса строки (
307) и столбец (Name), мы можем выполнить выборку с помощьюlocоператор, представленный в учебное пособие по выборке подмножеств.
В столбце "Sex" замените значения "male" на "M", а значения "female" на "F".
In [13]: titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"}) In [14]: titanic["Sex_short"] Out[14]: 0 M 1 F 2 F 3 F 4 M .. 886 M 887 F 888 F 889 M 890 M Name: Sex_short, Length: 891, dtype: object
В то время как
replace()не является строковым методом, он предоставляет удобный способ использования отображений или словарей для преобразования определенных значений. Требуетсяdictionaryдля определения соответствия{from : to}.
Предупреждение
Также есть replace() метод доступен для замены
определенного набора символов. Однако при наличии отображения нескольких
значений это становится:
titanic["Sex_short"] = titanic["Sex"].str.replace("female", "F")
titanic["Sex_short"] = titanic["Sex_short"].str.replace("male", "M")
Это стало бы громоздким и легко привело бы к ошибкам. Просто подумайте (или попробуйте сами), что произойдет, если эти два оператора применить в обратном порядке…
ПОМНИТЕ
Строковые методы доступны с использованием
strаксессор.Строковые методы работают поэлементно и могут использоваться для условного индексирования.
The
replaceметод является удобным методом для преобразования значений в соответствии с заданным словарём.
Полный обзор предоставлен на страницах руководства пользователя по работа с текстовыми данными.