In [1]: import pandas as pd
- 泰坦尼克号数据集
本教程使用以 CSV 格式存储的泰坦尼克号数据集。该数据包含以下数据列:
PassengerId: 每位乘客的 ID。
Survived: 乘客是否存活的指示。
0表示否,1表示是。Pclass: 三个船票等级之一:
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 中选择特定列?#
我对泰坦尼克号乘客的年龄感兴趣。
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
要选择单列,请在列名后使用方括号
[]。有关更多解释,请参阅 Python 和 pandas 中的方括号。
DataFrame 中的每一列都是一个 Series。当选择单列时,返回的对象是 pandas Series。我们可以通过检查输出的类型来验证这一点
In [6]: type(titanic["Age"])
Out[6]: pandas.Series
并查看输出的 shape
In [7]: titanic["Age"].shape
Out[7]: (891,)
DataFrame.shape 是 pandas Series 和 DataFrame 的一个属性(记住 读写教程,属性不要加括号),它包含行数和列数:(行数, 列数)。pandas Series 是 1 维的,只返回行数。
我对泰坦尼克号乘客的年龄和性别感兴趣。
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.DataFrame
In [11]: titanic[["Age", "Sex"]].shape
Out[11]: (891, 2)
选择返回了一个包含 891 行和 2 列的 DataFrame。请记住,DataFrame 是 2 维的,具有行和列维度。
有关索引的基本信息,请参阅用户指南中关于 索引和选择数据 的部分。
如何从 DataFrame 中过滤特定行?#
我对年龄大于 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
条件表达式(>,以及 ==、!=、<、<= 等)的输出实际上是一个布尔值(True 或 False)的 pandas Series,其行数与原始 DataFrame 相同。这样的布尔值 Series 可以通过将其放在选择方括号 [] 中来过滤 DataFrame。只有值为 True 的行才会被选择。
我们之前知道原始的泰坦尼克号 DataFrame 由 891 行组成。通过检查结果 DataFrame above_35 的 shape 属性,我们来看看满足条件的行数。
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 运算符 | 和 and 运算符 &。
我想处理年龄已知乘客的数据。
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 行仍然是相同的值。一种验证方法是检查 shape 是否已更改。
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: str
在这种情况下,一次性选取了行和列的子集,仅使用选择方括号
[]已经不够了。需要在选择方括号[]前使用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.iloc[:5, 3]
Out[27]:
0 anonymous
1 anonymous
2 anonymous
3 Futrelle, Mrs. Jacques Heath (Lily May Peel)
4 Allen, Mr. William Henry
Name: Name, dtype: str
请参阅用户指南中关于 索引的不同选择 的部分,以更深入地了解 loc 和 iloc 的用法。
请记住
选择数据子集时,使用方括号
[]。在这些方括号内,您可以使用单个列/行标签、标签列表、标签切片、条件表达式或冒号。
使用
loc进行基于标签的选择(使用行/列名称)。使用
iloc进行基于位置的选择(使用表格位置)。您可以根据
loc/iloc为选定的数据分配新值。
索引的完整概述请参阅用户指南中关于 索引和选择数据 的页面。