import pandas as pd
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/titanic.csv"
titanic = pd.read_csv(url)
titanic.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
Сделаем все имена символов строчными:
titanic["Name"].str.lower()
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
, содержащий фамилию пассажиров, извлекая часть перед запятой:
titanic["Name"].str.split(",")
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 элементов. Первый элемент - это часть перед запятой, а второй элемент - часть после запятой.
titanic["Surname"] = titanic["Name"].str.split(",").str.get(0)
titanic["Surname"]
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()
для извлечения соответствующей части.
Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя по разделению и замене строк.
Получим данные о графине на борту Титаника:
titanic["Name"].str.contains("Countess")
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
titanic[titanic["Name"].str.contains("Countess")]
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | Surname | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
759 | 760 | 1 | 1 | Rothes, the Countess. of (Lucy Noel Martha Dye... | female | 33.0 | 0 | 0 | 110152 | 86.5 | B77 | S | Rothes |
История в Википедии.
Строковый метод Series.str.contains()
проверяет каждое из значений в столбце, содержит ли строка слово Countess
и возвращает True
(если Countess
является частью имени) или False
(Countess
не является частью имени). Полученные данные могут быть использованы для фильтрации с использованием условного (логического) индексирования. Поскольку на Титанике была только 1 графиня, в результате мы получаем один ряд.
Методы Series.str.contains()
и Series.str.extract()
поддерживают механизм регулярных выражений
.
Дополнительная информация об извлечении частей строк доступна в разделе руководства пользователя по сопоставлению и извлечению строк.
Определим, у какого пассажира самое длинное имя?
titanic["Name"].str.len()
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()
применяется к каждому имени отдельно (поэлементно).
titanic["Name"].str.len().idxmax()
307
Затем необходимо получить соответствующее местоположение, желательно метку индекса в таблице, для которой длина имени самая большая. Метод idxmax()
не строковый, он применяется к целым числам, поэтому не используется str
.
titanic.loc[titanic["Name"].str.len().idxmax(), "Name"]
'Penasco y Castellana, Mrs. Victor de Satode (Maria Josefa Perez de Soto y Vallejo)'
Основываясь на индексном имени row
(307
) и столбце (Name
), мы можем сделать выбор, используя оператор loc
.
В столбце Sex
замените значения male
на M
, а female
- на F
.
titanic["Sex_short"] = titanic["Sex"].replace({"male": "M", "female": "F"})
titanic["Sex_short"]
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
В pandas
метод replace()
предоставляет удобный способ использования отображений или словарей для замены определенных значений.
Полный обзор представлен на страницах руководства пользователя по работе с текстовыми данными.
Подписка на онлайн-обучение