Pandas 2.2 中文官方教程和指南(一)(4)

简介: Pandas 2.2 中文官方教程和指南(一)

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相同行数的布尔值(TrueFalse)的 pandas Series。这样的布尔值Series可以通过将其放在选择括号[]之间来过滤DataFrame。只有值为True的行才会被选择。

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

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运算符。

使用lociloc选择特定行和/或列时,可以为所选数据分配新值。例如,为第四列的前 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] 

转到用户指南

查看用户指南关于索引选择的不同选择部分,以更深入了解lociloc的用法。

记住
  • 在选择数据子集时,使用方括号[]
  • 在这些括号内,您可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。
  • 使用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 SeriesTrueFalse)与原始 DataFrame 行数相同。这样的布尔值 Series 可以用于通过将其放在选择括号[]之间来过滤 DataFrame。只有值为True的行将被选中。

我们之前知道原始泰坦尼克DataFrame由 891 行组成。让我们通过检查above_35的结果DataFrameshape属性来查看满足条件的行数:

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运算符。

在使用lociloc选择特定行和/或列时,可以为所选数据分配新值。例如,要将名称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] 

前往用户指南

查看用户指南中关于索引的不同选择以获取有关lociloc用法的更多见解。

记住
  • 在选择数据子集时,使用方括号[]
  • 在这些括号内,您可以使用单个列/行标签、列/行标签列表、标签切片、条件表达式或冒号。
  • 使用loc选择特定行和/或列时,请使用行和列名称。
  • 使用iloc选择特定行和/或列时,请使用表中的位置。
  • 您可以根据loc/iloc的选择分配新值。

前往用户指南

用户指南页面提供了有关索引和选择数据的完整概述。

相关文章
|
11天前
|
数据采集 存储 数据可视化
Pandas高级教程:数据清洗、转换与分析
Pandas是Python的数据分析库,提供Series和DataFrame数据结构及数据分析工具,便于数据清洗、转换和分析。本教程涵盖Pandas在数据清洗(如缺失值、重复值和异常值处理)、转换(数据类型转换和重塑)和分析(如描述性统计、分组聚合和可视化)的应用。通过学习Pandas,用户能更高效地处理和理解数据,为数据分析任务打下基础。
32 3
|
1月前
|
存储 SQL JSON
Pandas 2.2 中文官方教程和指南(一)(3)
Pandas 2.2 中文官方教程和指南(一)
30 0
|
1月前
|
XML 关系型数据库 PostgreSQL
Pandas 2.2 中文官方教程和指南(一)(2)
Pandas 2.2 中文官方教程和指南(一)
35 0
|
1月前
|
XML 关系型数据库 MySQL
Pandas 2.2 中文官方教程和指南(一)(1)
Pandas 2.2 中文官方教程和指南(一)
32 0
|
1月前
|
C++ 索引 Python
Pandas 2.2 中文官方教程和指南(五)(4)
Pandas 2.2 中文官方教程和指南(五)
22 0
|
1月前
|
索引 Python
Pandas 2.2 中文官方教程和指南(五)(3)
Pandas 2.2 中文官方教程和指南(五)
23 0
|
1月前
|
SQL API 数据格式
Pandas 2.2 中文官方教程和指南(五)(2)
Pandas 2.2 中文官方教程和指南(五)
23 0
|
1月前
|
SQL API 数据格式
Pandas 2.2 中文官方教程和指南(五)(1)
Pandas 2.2 中文官方教程和指南(五)
31 0
|
1月前
|
索引 Python
Pandas 2.2 中文官方教程和指南(四)(4)
Pandas 2.2 中文官方教程和指南(四)
19 0
|
1月前
|
索引 Python
Pandas 2.2 中文官方教程和指南(四)(3)
Pandas 2.2 中文官方教程和指南(四)
23 0