Как выбрать подмножество из DataFrame?¶
In [1]: import pandas as pd
- Данные о Титанике
В этом руководстве используется набор данных Titanic, сохраненный в формате CSV. Данные состоят из следующих столбцов:
PassengerId: Идентификатор каждого пассажира.
Survived: Имеет значения 0 и 1. 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?¶
Меня интересует возраст пассажиров Титаника.
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
. Поскольку выбран один столбец, возвращаемый объект представляет собой Series
. Мы можем убедиться в этом, проверив тип вывода:
In [6]: type(titanic["Age"])
Out[6]: pandas.core.series.Series
И посмотрите на shape
вывода:
In [7]: titanic["Age"].shape
Out[7]: (891,)
DataFrame.shape
— это атрибут Series
и DataFrame
(вспомните урок по чтению и записи: круглые скобки для атрибутов не используются), содержащий количество строк и столбцов: (nrows, ncolumns). Series в pandas одномерна, так что возвращается только количество строк.
Меня интересует возраст и пол пассажиров Титаника.
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 с именами столбцов, тогда как внешние скобки (мы будем называть их «скобки выбора») используются для выбора данных из DataFrame
, как показано в предыдущем примере.
Возвращаемый тип данных — это 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 Name ... Ticket Fare Cabin Embarked 1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... ... PC 17599 71.2833 C85 C 6 7 0 1 McCarthy, Mr. Timothy J ... 17463 51.8625 E46 S 11 12 1 1 Bonnell, Miss. Elizabeth ... 113783 26.5500 C103 S 13 14 0 3 Andersson, Mr. Anders Johan ... 347082 31.2750 NaN S 15 16 1 2 Hewlett, Mrs. (Mary D Kingcome) ... 248706 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
На самом деле результатом выполнения условия (>
, но возможны и ==
, !=
, <
, <=
и прочие) является Series
со значениями True
либо False
и с тем же количеством строк, что и в исходном DataFrame
. Такую Series
с булевыми значениями можно использовать для фильтрации DataFrame
, помещая Series
между скобками выбора []
. Из DataFrame
будут выбраны только те строки, для которых установлено значение True
.
Мы уже знаем, что оригинальный 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 Name ... Ticket Fare Cabin Embarked 0 1 0 3 Braund, Mr. Owen Harris ... A/5 21171 7.2500 NaN S 2 3 1 3 Heikkinen, Miss. Laina ... STON/O2. 3101282 7.9250 NaN S 4 5 0 3 Allen, Mr. William Henry ... 373450 8.0500 NaN S 5 6 0 3 Moran, Mr. James ... 330877 8.4583 NaN Q 7 8 0 3 Palsson, Master. Gosta Leonard ... 349909 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 Name ... Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris ... A/5 21171 7.2500 NaN S
2 3 1 3 Heikkinen, Miss. Laina ... STON/O2. 3101282 7.9250 NaN S
4 5 0 3 Allen, Mr. William Henry ... 373450 8.0500 NaN S
5 6 0 3 Moran, Mr. James ... 330877 8.4583 NaN Q
7 8 0 3 Palsson, Master. Gosta Leonard ... 349909 21.0750 NaN S
[5 rows x 12 columns]
Примечание
При объединении нескольких условных операторов каждое условие должно быть заключено в круглые скобки ()
. Более того, вы не можете использовать or
или and
, а должны использовать |
в качестве оператора или и &
в качестве оператора и.
См. специальный раздел в руководстве пользователя о булевом индексировании или о функции 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]
Условная функция
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
.
Полный обзор индексирования представлен на страницах руководства пользователя об индексировании и выборках данных.