import pandas as pd
url = "https://raw.githubusercontent.com/dm-fedorov/pandas_basic/master/%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%BE%D0%B5%20%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B2%20pandas/data/titanic.csv"
titanic = pd.read_csv(url)
Меня интересует возраст пассажиров:
ages = titanic["Age"]
ages
0 22.0 1 38.0 2 26.0 3 35.0 4 35.0 ... 886 27.0 887 19.0 888 NaN 889 26.0 890 32.0 Name: Age, Length: 891, dtype: float64
Чтобы выбрать один столбец, используйте квадратные скобки []
с именем интересующего столбца.
type(titanic["Age"])
pandas.core.series.Series
Посмотрим на результат обращения к атрибуту shape
:
titanic["Age"].shape
(891,)
DataFrame.shape
является атрибутом Series
и DataFrame
и содержит количество строк и столбцов (nrows, ncolumns)
.
Серия является одномерной, поэтому возвращается только количество строк.
Меня интересует возраст и пол пассажиров:
age_sex = titanic[["Age", "Sex"]]
age_sex.head()
Age | Sex | |
---|---|---|
0 | 22.0 | male |
1 | 38.0 | female |
2 | 26.0 | female |
3 | 35.0 | female |
4 | 35.0 | male |
Чтобы выбрать несколько столбцов, используйте список имен столбцов в квадратных скобках []
.
Внутренние квадратные скобки определяют список Python с именами столбцов, тогда как внешние квадратные скобки используются для выбора данных.
Возвращаемый тип данных - DataFrame
:
type(titanic[["Age", "Sex"]])
pandas.core.frame.DataFrame
titanic[["Age", "Sex"]].shape
(891, 2)
Видим, что DataFrame
содержит 891 строк и 2 столбца.
Для получения информации об индексации см. Раздел руководства пользователя по индексированию и выбору данных.
Меня интересуют пассажиры старше 35 лет:
above_35 = titanic[titanic["Age"] > 35]
above_35.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54.0 | 0 | 0 | 17463 | 51.8625 | E46 | S |
11 | 12 | 1 | 1 | Bonnell, Miss. Elizabeth | female | 58.0 | 0 | 0 | 113783 | 26.5500 | C103 | S |
13 | 14 | 0 | 3 | Andersson, Mr. Anders Johan | male | 39.0 | 1 | 5 | 347082 | 31.2750 | NaN | S |
15 | 16 | 1 | 2 | Hewlett, Mrs. (Mary D Kingcome) | female | 55.0 | 0 | 0 | 248706 | 16.0000 | NaN | S |
Условие внутри скобок проверяет, для каких строк столбец имеет значение больше 35:
titanic["Age"] > 35
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
, помещая его внутрь скобок выбора []
.
Будут выбраны только те строки, для которых это значение True
.
Давайте посмотрим на количество строк, которые удовлетворяют условию, проверив атрибут shape
полученного DataFrame
:
above_35.shape
(217, 12)
Меня интересуют пассажиры из кают класса 2
и 3
:
class_23 = titanic[titanic["Pclass"].isin([2, 3])]
Подобно условному выражению, isin()
возвращает True
для каждой строки, значения которой находятся в предоставленном списке.
Чтобы отфильтровать строки на основе такой функции, используйте функцию внутри скобок []
.
Вышесказанное эквивалентно фильтрации по строкам, для которых класс равен 2
или 3
, и объединению двух операторов с помощью (или) |
:
class_23 = titanic[(titanic["Pclass"] == 2) | (titanic["Pclass"] == 3)]
class_23.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2.0 | 3 | 1 | 349909 | 21.0750 | NaN | S |
См. Специальный раздел в руководстве пользователя о булевой индексации.
Я хочу работать с данными о пассажирах, для которых известен возраст:
age_no_na = titanic[titanic["Age"].notna()]
age_no_na.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
notna()
возвращает True
для каждой строки, значение которой отлично от NA
(np.NaN
).
Проверим, изменилась ли форма:
age_no_na.shape
(714, 12)
Меня интересуют имена пассажиров старше 35
лет:
adult_names = titanic.loc[titanic["Age"] > 35, "Name"]
adult_names.head()
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
перед скобками выбора []
.
Как для части до, так и после запятой можно использовать одну метку, список меток, часть меток, условное выражение или двоеточие.
Используя особенности двоеточия, если хотите выбрать все строки или столбцы.
Меня интересуют строки с 9
по 24
и столбцы с 2
по 4
:
titanic.iloc[9:25, 2:5]
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 |
14 | 3 | Vestrom, Miss. Hulda Amanda Adolfina | female |
15 | 2 | Hewlett, Mrs. (Mary D Kingcome) | female |
16 | 3 | Rice, Master. Eugene | male |
17 | 2 | Williams, Mr. Charles Eugene | male |
18 | 3 | Vander Planke, Mrs. Julius (Emelia Maria Vande... | female |
19 | 3 | Masselmani, Mrs. Fatima | female |
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 |
Опять же, подмножество строк и столбцов создается за один раз, и просто использование скобок выбора []
больше не достаточно.
Если вас интересуют определенные строки и/или столбцы в зависимости от их положения в таблице, используйте оператор iloc
перед []
.
При выборе определенных строк и/или столбцов с помощью loc
или iloc
, новым значениям могут быть назначены выбранные данные.
Например, чтобы присвоить имя anonymous первым 3
элементам третьего столбца:
titanic.iloc[0:3, 3] = "anonymous"
titanic.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | anonymous | male | 22.0 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | anonymous | female | 38.0 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | anonymous | female | 26.0 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35.0 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35.0 | 0 | 0 | 373450 | 8.0500 | NaN | S |
Обратитесь к разделу руководства пользователя по различным вариантам индексации, чтобы получить более полное представление об использовании loc
и iloc
.
Полный обзор индексации представлен в руководстве пользователя по индексированию и выбору данных.
Подписка на онлайн-обучение