Pandas 2.2 中文官方教程和指南(一)(3)https://developer.aliyun.com/article/1510594
如何从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
条件表达式的输出(>
,但也可以是 ==
,!=
,<
,<=
,…)实际上是一个具有与原始DataFrame
相同行数的布尔值(True
或 False
)的 pandas Series
。这样的布尔值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
运算符&
。
到用户指南
请查看用户指南中关于布尔索引或 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()
条件函数会对值不是Null
值的每一行返回True
。因此,可以将其与选择括号[]
结合使用来过滤数据表。
你可能会想知道实际发生了什么变化,因为前 5 行仍然是相同的值。验证的一种方法是检查形状是否发生了变化:
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: 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
选择特定行和/或列时,可以为所选数据分配新值。例如,为第四列的前 3 个元素分配名称anonymous
:
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
分配新值给选择。
转到用户指南
用户指南页面提供了有关索引和选择数据的完整概述。
如何从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
- 要选择单列,使用方括号
[]
和感兴趣的列的列名。
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
是一个属性(请记住读写教程,对于属性不要使用括号),包含行数和列数:(nrows, ncolumns)。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.core.frame.DataFrame
In [11]: titanic[["Age", "Sex"]].shape Out[11]: (891, 2)
选择返回了一个具有 891 行和 2 列的DataFrame
。请记住,DataFrame
是二维的,具有行和列两个维度。
转到用户指南
有关索引的基本信息,请参阅用户指南中关于索引和选择数据的部分。
如何从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
条件表达式的输出(>
, 也可以是 ==
, !=
, <
, <=
,…)实际上是一个布尔值的 pandas Series
(True
或 False
)与原始 DataFrame
行数相同。这样的布尔值 Series
可以用于通过将其放在选择括号[]
之间来过滤 DataFrame
。只有值为True
的行将被选中。
我们之前知道原始泰坦尼克DataFrame
由 891 行组成。让我们通过检查above_35
的结果DataFrame
的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
运算符 &
。
转到用户指南
请查看用户指南中关于布尔索引或 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()
条件函数对于每一行数值不是Null
值时返回True
。因此,可以与选择括号[]
结合使用来过滤数据表。
你可能想知道实际发生了什么变化,因为前 5 行仍然是相同的值。验证的一种方法是检查形状是否发生了变化:
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: 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
的选择分配新值。
前往用户指南
用户指南页面提供了有关索引和选择数据的完整概述。