In [1]: import pandas as pd
Данные, используемые в этом руководстве:
  • Этот учебник использует набор данных 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?#

../../_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. Поскольку выбран один столбец, возвращаемый объект является 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?#

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

../../_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.

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

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