Data used for this tutorial:
  • 本教程使用泰坦尼克号数据集,它以 CSV 格式存储。该数据包含以下数据列:

    • PassengerId:每位乘客的 ID。

    • Survived:乘客是否存活的指示。0 表示生存,1 表示死亡。

    • Pclass:3 个票务等级之一:1 等、2 等和 3 等。

    • Name:乘客姓名。

    • Sex:乘客性别。

    • Age:乘客年龄(以年为单位)。

    • SibSp:船上兄弟姐妹或配偶的数量。

    • Parch:船上父母或子女的数量。

    • Ticket:乘客的票号。

    • Fare:指示票价。

    • Cabin:乘客的客舱号。

    • Embarked:登船港口。

    To raw data

如何选择 DataFrame 的子集?#

如何从 DataFrame 中选择特定列?#

../../_images/03_subset_columns.svg
  • 我对泰坦尼克号乘客的年龄感兴趣。

    要选择单列,请使用方括号 [] 并加上您感兴趣的列的列名。

DataFrame 中的每一列都是一个 Series 。由于选择的是单列,因此返回的对象是一个 pandas Series 。我们可以通过检查输出的类型来验证这一点:

并查看输出的 shape

DataFrame.shape 是一个 pandas SeriesDataFrame 的属性(请记住 tutorial on reading and writing ,属性不要使用括号),包含行数和列数:(行数, 列数)。pandas Series 是 1 维的,只返回行数。

  • 我对泰坦尼克号乘客的年龄和性别感兴趣。

    要选择多列,请在选择括号 [] 内使用列名列表。

备注

内部方括号定义了一个包含列名的 Python list ,而外部括号用于从 pandas DataFrame 中选择数据,如前一个示例所示。

返回的数据类型是 pandas DataFrame:

选择返回了一个包含 891 行和 2 列的 DataFrame。记住,DataFrame 是 2 维的,同时具有行和列维度。

To user guide

有关索引的基本信息,请参阅用户指南中关于 indexing and selecting data 的部分。

如何从 DataFrame 中筛选特定行?#

../../_images/03_subset_rows.svg
  • 我对年龄大于 35 岁的乘客感兴趣。

    要根据条件表达式选择行,请在选择方括号 [] 内使用条件。

选择方括号 [] 内的条件 titanic["Age"] > 35 检查 Age 列的值大于 35 的行:

条件表达式(>,但 ==!=<<= 等也可以)的输出实际上是一个布尔值(TrueFalse)的 pandas Series,其行数与原始 DataFrame 相同。此类布尔值 Series 可通过将其置于选择方括号 [] 之间来过滤 DataFrame。将只选择值为 True 的行。

我们之前知道,原始的 Titanic DataFrame 由 891 行组成。通过检查结果 DataFrame above_35shape 属性,我们来看看满足条件的行数:

  • 我对泰坦尼克号的 2 等舱和 3 等舱乘客感兴趣。

    与条件表达式类似,isin() 条件函数会为值在列表中的每一行返回 True。要根据此类函数过滤行,请在选择方括号 [] 内使用条件函数。在本例中,选择方括号 [] 内的条件 titanic["Pclass"].isin([2, 3]) 检查 Pclass 列为 2 或 3 的行。

上面的语句等同于筛选出舱位为 2 或 3 的行,并将这两个语句与 ``|``(或)运算符组合起来:

备注

组合多个条件语句时,每个条件都必须用括号 () 括起来。此外,不能使用 or/and,而必须使用 or 运算符 |and 运算符 &

To user guide

请参阅用户指南中关于 boolean indexingisin function 的专门部分。

  • 我想处理年龄已知的乘客数据。

    notna() 条件函数为值不是 Null 值的每一行返回 True。因此,这可以与选择方括号 [] 结合使用来过滤数据表。

您可能会想,实际发生了什么变化,因为前 5 行仍然是相同的值。一种验证方法是检查形状是否已更改:

To user guide

有关缺失值的更多专用函数,请参阅用户指南中关于 handling missing data 的部分。

如何从 DataFrame 中选择特定行和列?#

../../_images/03_subset_columns_rows.svg
  • 我对年龄大于 35 岁的乘客姓名感兴趣。

    在这种情况下,行和列的子集是一次性完成的,仅使用选择方括号 [] 不再足够。必须在选择方括号 [] 前使用 loc/iloc 运算符。使用 loc/iloc 时,逗号前的部分是要选择的行,逗号后的部分是要选择的列。

当使用列名、行标签或条件表达式时,请在选择方括号 [] 前使用 loc 运算符。对于逗号前后的部分,您可以使用单个标签、标签列表、标签切片、条件表达式或冒号。使用冒号表示您要选择所有行或列。

  • 我对第 10 到 25 行和第 3 到 5 列感兴趣。

    同样,行和列的子集是一次性完成的,仅使用选择方括号 [] 不再足够。当根据表格中的位置特定于某些行和/或列时,请在选择方括号 [] 前使用 iloc 运算符。

当使用 lociloc 选择特定行和/或列时,可以为选定的数据分配新值。例如,将名称 anonymous 分配给第四列的前 3 个元素:

To user guide

请参阅用户指南中关于 different choices for indexing 的部分,以更深入地了解 lociloc 的用法。

REMEMBER

  • 选择数据的子集时,使用方括号 []

  • 在这些方括号内,您可以使用单个列/行标签、标签列表、标签切片、条件表达式或冒号。

  • 使用行和列名称时,请使用 loc 来选择特定的行和/或列。

  • 使用表格中的位置时,请使用 iloc 来选择特定的行和/或列。

  • 您可以根据 loc/iloc 为选定的内容分配新值。

To user guide

有关索引的完整概述,请参阅用户指南中关于 indexing and selecting data 的页面。