Как выбрать подмножество из 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.
Полный обзор индексирования представлен на страницах руководства пользователя об индексировании и выборках данных.