Как выбрать подмножество из 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?

../../_images/03_subset_columns.svg
  • Меня интересует возраст пассажиров Титаника.

    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?

../../_images/03_subset_rows.svg
  • Меня интересуют пассажиры старше 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?

../../_images/03_subset_columns_rows.svg
  • Меня интересуют имена пассажиров старше 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.

В руководстве пользователя

Полный обзор индексирования представлен на страницах руководства пользователя об индексировании и выборках данных.