Pandas 数据过滤

PandasBeginner
立即练习

介绍

欢迎来到 Pandas 数据过滤实验!数据过滤是数据分析中最常见也是最重要的任务之一。它允许你选择满足特定条件的数据子集,从而让你能够专注于与你的分析最相关的信息。

Pandas 是一个强大的 Python 数据处理和分析库。其核心数据结构 DataFrame 是一个二维数据表,包含行和列。在本实验中,你将学习从 Pandas DataFrame 中过滤行的几种基本技术。我们将涵盖:

  • 使用单个布尔条件进行过滤。
  • 使用逻辑运算符组合多个条件。
  • 使用 isin() 方法匹配多个值。
  • 删除包含缺失数据(NaN)的行。
  • 计算过滤后数据的数量。

在本实验结束时,你将为在 Pandas 项目中选择和隔离数据打下坚实的基础。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 97%。获得了学习者 98% 的好评率。

使用布尔条件过滤行

在本步骤中,你将学习最基本的过滤技术:布尔索引(boolean indexing)。此方法涉及创建一个布尔条件,该条件会返回一个包含 TrueFalse 值的 Pandas Series。当你将此 Series 传递给 DataFrame 时,它只会返回值为 True 的那些行。

让我们开始过滤 DataFrame,找出所有年龄大于 30 的员工。

首先,在左侧编辑器中打开 main.py 文件。该文件已预先填充了示例 DataFrame。

现在,用以下代码替换 main.py 文件底部的现有 print 语句。此代码创建了一个布尔条件 df['Age'] > 30,并使用它来过滤 DataFrame。

## Filter for employees older than 30
older_than_30 = df[df['Age'] > 30]

print("Employees older than 30:")
print(older_than_30)

你完整的 main.py 文件现在应该如下所示:

import pandas as pd
import numpy as np

## Create a sample DataFrame
data = {
    'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank'],
    'Department': ['HR', 'HR', 'Sales', 'IT', 'IT', 'Finance'],
    'Age': [25, 45, 38, 52, 29, 33],
    'Salary': [50000, 80000, 75000, 95000, 62000, np.nan]
}

df = pd.DataFrame(data)

## Filter for employees older than 30
older_than_30 = df[df['Age'] > 30]

print("Employees older than 30:")
print(older_than_30)

现在,让我们运行脚本。打开终端并执行以下命令:

python3 main.py

你应该会看到以下输出,其中仅列出了年龄大于 30 的员工。

Employees older than 30:
      Name Department  Age   Salary
1      Bob         HR   45  80000.0
2  Charlie      Sales   38  75000.0
3    David         IT   52  95000.0
5    Frank    Finance   33      NaN

使用 '&' 运算符组合过滤条件

在本步骤中,我们将组合多个条件来执行更复杂的过滤。你可以使用逻辑运算符组合布尔条件。最常见的运算符是 & 表示 AND(与),| 表示 OR(或)。

一个关键的语法规则是,由于 Python 的运算符优先级,每个条件都必须用括号 () 括起来。

让我们过滤 DataFrame,找出同时属于“IT”部门 年龄大于 30 的员工。

修改你的 main.py 文件。将上一步的过滤代码替换为下面的新代码。

## Filter for employees in IT and older than 30
it_and_older = df[(df['Department'] == 'IT') & (df['Age'] > 30)]

print("IT employees older than 30:")
print(it_and_older)

请注意,每个条件 df['Department'] == 'IT'df['Age'] > 30 都用自己的括号括起来。

保存 main.py 文件,并在终端中运行它:

python3 main.py

输出将只显示满足两个条件的员工。在我们的数据集中,只有 David 符合此标准。

IT employees older than 30:
    Name Department  Age   Salary
3  David         IT   52  95000.0

使用 isin 方法进行值匹配

在本步骤中,你将学习如何过滤出列值是多个可能值之一的行。虽然你可以使用多个 | (OR) 条件,但更高效且可读性更强的方法是使用 isin() 方法。此方法接受一个值列表,并为列值在该列表中的每一行返回 True

让我们找出所有在“HR”或“Finance”部门工作的员工。

使用以下代码更新 main.py 文件中的过滤逻辑:

## Filter for employees in HR or Finance departments
hr_or_finance = df[df['Department'].isin(['HR', 'Finance'])]

print("Employees in HR or Finance:")
print(hr_or_finance)

在这里,isin(['HR', 'Finance']) 检查 Department 列中哪些行的值是“HR”或“Finance”。

保存文件并在终端中执行脚本:

python3 main.py

输出将显示来自指定部门的所有员工。

Employees in HR or Finance:
    Name Department  Age   Salary
0  Alice         HR   25  50000.0
1    Bob         HR   45  80000.0
5  Frank    Finance   33      NaN

使用 notnull 过滤 NaN 值

在本步骤中,我们将处理如何处理缺失数据。在 Pandas 中,缺失值通常用 NaN (Not a Number) 表示。在执行计算之前,通常需要过滤掉包含这些缺失值的行。

notnull() 方法返回一个布尔 Series,对于非缺失值返回 True,对于缺失值 (NaN) 返回 False。你可以使用它轻松移除特定列中包含 NaN 的行。

让我们过滤 DataFrame,只查看我们有薪资信息的员工。

修改 main.py 文件,在 Salary 列上使用 notnull() 方法。

## Filter out rows with missing Salary
valid_salary = df[df['Salary'].notnull()]

print("Employees with valid salary information:")
print(valid_salary)

此代码将选择 Salary 列不包含 NaN 的所有行。

保存文件并在终端中运行脚本:

python3 main.py

正如你在输出中看到的,薪资为 NaN 的 Frank 已被排除在结果之外。

Employees with valid salary information:
      Name Department  Age   Salary
0    Alice         HR   25  50000.0
1      Bob         HR   45  80000.0
2  Charlie      Sales   38  75000.0
3    David         IT   52  95000.0
4      Eve         IT   29  62000.0

使用 len 函数统计过滤后的行数

在最后这个步骤中,你将学习如何计算过滤后的 DataFrame 中的行数。应用过滤器后,你通常需要知道有多少行符合你的标准。一个简单的方法是使用 Python 内置的 len() 函数,它返回 DataFrame 中的行数。

让我们过滤出“IT”部门的所有员工,然后计算他们的数量。

使用以下代码更新你的 main.py 文件。我们将首先过滤 DataFrame,然后将结果 DataFrame 传递给 len() 函数。

## Filter for employees in the IT department
it_employees = df[df['Department'] == 'IT']

## Count the number of IT employees
num_it_employees = len(it_employees)

print(f"Number of employees in IT: {num_it_employees}")

此代码首先创建一个新的 DataFrame it_employees,其中只包含 IT 部门的行。然后,它计算这个新 DataFrame 的长度,并打印一个包含结果的格式化字符串。

保存文件并运行脚本:

python3 main.py

输出将是告诉你的计数的单行。

Number of employees in IT: 2

总结

恭喜你完成了 Pandas 数据过滤实验!

在这个实验中,你学习并实践了从 Pandas DataFrame 中选择数据子集的基本技术。你已经掌握了:

  • 布尔索引 (Boolean Indexing):基于单个条件过滤数据(例如,df[df['Age'] > 30])。
  • 组合过滤器 (Combining Filters):使用 & (AND) 运算符同时应用多个条件,并记住将每个条件用括号括起来。
  • 使用 isin() 进行值匹配 (Value Matching with isin()):高效地过滤出列值与给定列表中的任何值匹配的行。
  • 处理缺失数据 (Handling Missing Data):使用 notnull() 方法移除包含 NaN 值的行。
  • 计算过滤后的行数 (Counting Filtered Rows):使用 len() 函数获取过滤后 DataFrame 的行数。

这些过滤技能是几乎所有数据分析任务的基础。掌握它们将使你能够有效地探索和准备数据集,以进行进一步的分析和可视化。继续练习这些技术,以提高你使用 Pandas 的熟练度。