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]
Как выбрать подмножество DataFrame?#
Как выбрать определенные столбцы из DataFrame?#
Меня интересует возраст пассажиров Титаника.
In [4]: ages = titanic["Age"] In [5]: ages.head() Out[5]: 0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 Name: Age, dtype: float64
Для выбора одного столбца используйте квадратные скобки
[]с именем столбца интересующего столбца.
Каждый столбец в DataFrame является Series. Поскольку выбран один столбец,
возвращаемый объект является pandas Series. Мы можем проверить это, проверив тип вывода:
In [6]: type(titanic["Age"])
Out[6]: pandas.core.series.Series
И посмотрите на shape выходных данных:
In [7]: titanic["Age"].shape
Out[7]: (891,)
DataFrame.shape является атрибутом (помните руководство по чтению и записи, не используйте скобки для атрибутов) в
pandas Series и DataFrame содержащий количество строк и
столбцов: (nrows, ncolumns). pandas Series является одномерным, и возвращается только
количество строк.
Меня интересуют возраст и пол пассажиров Титаника.
In [8]: age_sex = titanic[["Age", "Sex"]] In [9]: age_sex.head() Out[9]: Age Sex 0 22.0 male 1 38.0 female 2 26.0 female 3 35.0 female 4 35.0 male
Для выбора нескольких столбцов используйте список имен столбцов внутри квадратных скобок выбора
[].
Примечание
Внутренние квадратные скобки определяют
список Python с именами столбцов, тогда как внешние квадратные скобки используются для выбора данных из pandas
DataFrame как показано в предыдущем примере.
Возвращаемый тип данных — pandas DataFrame:
In [10]: type(titanic[["Age", "Sex"]])
Out[10]: pandas.core.frame.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)
Выбор вернул DataFrame с 891 строками и 2 столбцами. Помните, что
DataFrame является двумерным с размерностями строк и столбцов.
Для базовой информации об индексировании см. раздел руководства пользователя о индексирование и выбор данных.
Как отфильтровать определенные строки из DataFrame?#
Меня интересуют пассажиры старше 35 лет.
In [12]: above_35 = titanic[titanic["Age"] > 35] In [13]: above_35.head() Out[13]: PassengerId Survived Pclass ... Fare Cabin Embarked 1 2 1 1 ... 71.2833 C85 C 6 7 0 1 ... 51.8625 E46 S 11 12 1 1 ... 26.5500 C103 S 13 14 0 3 ... 31.2750 NaN S 15 16 1 2 ... 16.0000 NaN S [5 rows x 12 columns]
Для выбора строк на основе условного выражения используйте условие внутри квадратных скобок выборки
[].
Условие внутри квадратных скобок
выбора titanic["Age"] > 35 проверяет, для каких строк Age
столбец имеет значение больше 35:
In [14]: titanic["Age"] > 35
Out[14]:
0 False
1 True
2 False
3 False
4 False
...
886 False
887 False
888 False
889 False
890 False
Name: Age, Length: 891, dtype: bool
Результат условного выражения (>, но также ==,
!=, <, <=,… сработает) на самом деле является pandas Series логических значений (либо True или False) с тем же количеством
строк, что и исходный DataFrame. Такой Series логических значений
может использоваться для фильтрации DataFrame поместив его между
скобками выбора []Только строки, для которых значение True
будет выбрано.
Мы знаем из предыдущего, что исходный Titanic DataFrame состоит из
891 строки. Давайте посмотрим на количество строк, удовлетворяющих
условию, проверив shape атрибут полученного
DataFrame above_35:
In [15]: above_35.shape
Out[15]: (217, 12)
Меня интересуют пассажиры Титаника из кают класса 2 и 3.
In [16]: class_23 = titanic[titanic["Pclass"].isin([2, 3])] In [17]: class_23.head() Out[17]: PassengerId Survived Pclass ... Fare Cabin Embarked 0 1 0 3 ... 7.2500 NaN S 2 3 1 3 ... 7.9250 NaN S 4 5 0 3 ... 8.0500 NaN S 5 6 0 3 ... 8.4583 NaN Q 7 8 0 3 ... 21.0750 NaN S [5 rows x 12 columns]
Аналогично условному выражению,
isin()условная функция возвращаетTrueдля каждой строки значения находятся в предоставленном списке. Чтобы отфильтровать строки на основе такой функции, используйте условную функцию внутри квадратных скобок выборки[]. В этом случае условие внутри квадратных скобок выбораtitanic["Pclass"].isin([2, 3])проверяет, для каких строкPclassстолбец равен либо 2, либо 3.
Вышеуказанное эквивалентно фильтрации строк, где класс равен либо 2, либо 3, и объединению двух условий с помощью | (или)
оператор:
In [18]: class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]
In [19]: class_23.head()
Out[19]:
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
2 3 1 3 ... 7.9250 NaN S
4 5 0 3 ... 8.0500 NaN S
5 6 0 3 ... 8.4583 NaN Q
7 8 0 3 ... 21.0750 NaN S
[5 rows x 12 columns]
Примечание
При объединении нескольких условных выражений каждое условие должно быть заключено в круглые скобки (). Более того, вы не можете использовать
or/and но необходимо использовать or operator | и and
operator &.
См. специальный раздел в руководстве пользователя о булевую индексацию или о функция isin.
Я хочу работать с данными пассажиров, для которых известен возраст.
In [20]: age_no_na = titanic[titanic["Age"].notna()] In [21]: age_no_na.head() Out[21]: 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]
The
notna()условная функция возвращаетTrueдля каждой строки значения не являютсяNullзначение. Таким образом, это можно комбинировать с селекторными скобками[]для фильтрации таблицы данных.
Вы можете задаться вопросом, что именно изменилось, так как первые 5 строк всё ещё содержат те же значения. Один из способов проверки — проверить, изменилась ли форма данных:
In [22]: age_no_na.shape
Out[22]: (714, 12)
Для более специализированных функций по пропущенным значениям см. раздел руководства пользователя о обработка пропущенных данных.
Как выбрать определенные строки и столбцы из DataFrame?#
Меня интересуют имена пассажиров старше 35 лет.
In [23]: adult_names = titanic.loc[titanic["Age"] > 35, "Name"] In [24]: adult_names.head() Out[24]: 1 Cumings, Mrs. John Bradley (Florence Briggs Th... 6 McCarthy, Mr. Timothy J 11 Bonnell, Miss. Elizabeth 13 Andersson, Mr. Anders Johan 15 Hewlett, Mrs. (Mary D Kingcome) Name: Name, dtype: object
В этом случае подмножество строк и столбцов создаётся за один раз, просто используя квадратные скобки для выбора
[]уже недостаточно.loc/ilocоператоры требуются перед скобками выбора[]. При использованииloc/iloc, часть до запятой — это строки, которые вы хотите выбрать, а часть после запятой — столбцы, которые вы хотите выбрать.
При использовании имён столбцов, меток строк или условного выражения используйте loc оператор перед квадратными скобками выбора []. Для обеих
частей до и после запятой можно использовать одну метку, список
меток, срез меток, условное выражение или двоеточие. Использование
двоеточия указывает, что нужно выбрать все строки или столбцы.
Меня интересуют строки с 10 по 25 и столбцы с 3 по 5.
In [25]: titanic.iloc[9:25, 2:5] Out[25]: Pclass Name Sex 9 2 Nasser, Mrs. Nicholas (Adele Achem) female 10 3 Sandstrom, Miss. Marguerite Rut female 11 1 Bonnell, Miss. Elizabeth female 12 3 Saundercock, Mr. William Henry male 13 3 Andersson, Mr. Anders Johan male .. ... ... ... 20 2 Fynney, Mr. Joseph J male 21 2 Beesley, Mr. Lawrence male 22 3 McGowan, Miss. Anna "Annie" female 23 1 Sloper, Mr. William Thompson male 24 3 Palsson, Miss. Torborg Danira female [16 rows x 3 columns]
Снова, подмножество строк и столбцов создаётся за один раз, просто используя квадратные скобки выборки
[]уже недостаточно. Когда требуется выбрать определенные строки и/или столбцы на основе их позиции в таблице, используйтеilocоператор перед скобками выбора[].
При выборе определенных строк и/или столбцов с loc или iloc,
новые значения можно присвоить выбранным данным. Например, чтобы присвоить
имя anonymous к первым 3 элементам четвертого столбца:
In [26]: titanic.iloc[0:3, 3] = "anonymous"
In [27]: titanic.head()
Out[27]:
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]
См. раздел руководства пользователя о различные варианты индексации чтобы получить больше информации об использовании loc и iloc.
ПОМНИТЕ
При выборе подмножеств данных используются квадратные скобки
[]используются.Внутри этих скобок можно использовать одну метку столбца/строки, список меток столбцов/строк, срез меток, условное выражение или двоеточие.
Выбор определенных строк и/или столбцов с помощью
locпри использовании названий строк и столбцов.Выбор определенных строк и/или столбцов с помощью
ilocпри использовании позиций в таблице.Вы можете присваивать новые значения выборке на основе
loc/iloc.
Полный обзор индексации представлен в руководстве пользователя на страницах индексирование и выбор данных.