MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

Python if语句在数据分析中的筛选逻辑

2024-10-086.3k 阅读

Python if 语句基础

if 语句语法结构

在 Python 中,if 语句用于根据条件执行不同的代码块。其基本语法如下:

if condition:
    # 当条件为 True 时执行的代码
    statement1
    statement2
    # 可以有多个语句

这里的 condition 是一个表达式,它会被求值为 TrueFalse。如果 conditionTrue,则缩进块中的代码(statement1statement2 等)将被执行;如果为 False,则这些代码块将被跳过。

例如,判断一个数字是否大于 10:

num = 15
if num > 10:
    print(f"{num} 大于 10")

在这个例子中,num > 10 是条件,当这个条件为 True 时,会执行 print 语句。

if - else 结构

if - else 结构允许在条件为 TrueFalse 时分别执行不同的代码块。语法如下:

if condition:
    # 当条件为 True 时执行的代码
    true_statement1
    true_statement2
else:
    # 当条件为 False 时执行的代码
    false_statement1
    false_statement2

比如判断一个数是偶数还是奇数:

num = 7
if num % 2 == 0:
    print(f"{num} 是偶数")
else:
    print(f"{num} 是奇数")

这里 num % 2 == 0 是判断条件,当条件为 True 时,输出该数是偶数;为 False 时,输出该数是奇数。

if - elif - else 结构

if - elif - else 结构用于处理多个互斥条件。elifelse if 的缩写。语法如下:

if condition1:
    # 当 condition1 为 True 时执行的代码
    statement1
elif condition2:
    # 当 condition1 为 False 且 condition2 为 True 时执行的代码
    statement2
else:
    # 当所有条件都为 False 时执行的代码
    statement3

例如,根据学生的成绩给出不同的评价:

score = 85
if score >= 90:
    print("优秀")
elif score >= 80:
    print("良好")
elif score >= 60:
    print("及格")
else:
    print("不及格")

这里根据 score 的值,依次判断不同的条件,执行相应的评价输出。

Python if 语句在数据分析中的简单筛选应用

数据准备

在数据分析中,我们通常会处理各种数据结构,比如列表、字典、NumPy 数组、Pandas DataFrame 等。以列表为例,假设我们有一个包含学生成绩的列表:

scores = [78, 92, 85, 64, 58, 95]

筛选符合条件的数据

  1. 筛选出及格成绩 我们可以使用 if 语句遍历列表,筛选出及格(成绩大于等于 60)的学生成绩。
scores = [78, 92, 85, 64, 58, 95]
passing_scores = []
for score in scores:
    if score >= 60:
        passing_scores.append(score)
print(passing_scores)

在这段代码中,通过 for 循环遍历 scores 列表,对每个成绩使用 if 语句判断是否大于等于 60,如果是,则将其添加到 passing_scores 列表中。

  1. 筛选出优秀成绩(90 分及以上)
scores = [78, 92, 85, 64, 58, 95]
excellent_scores = []
for score in scores:
    if score >= 90:
        excellent_scores.append(score)
print(excellent_scores)

同样是遍历列表,这次判断条件是成绩大于等于 90,满足条件的成绩被添加到 excellent_scores 列表。

基于多个条件的筛选

有时候,我们需要基于多个条件进行筛选。比如筛选出成绩在 80 到 90 之间(包括 80 和 90)的学生成绩。

scores = [78, 92, 85, 64, 58, 95]
good_scores = []
for score in scores:
    if 80 <= score <= 90:
        good_scores.append(score)
print(good_scores)

这里使用了复合条件 80 <= score <= 90,只有满足该复合条件的成绩才会被添加到 good_scores 列表。

在 NumPy 数组中的筛选应用

NumPy 数组简介

NumPy 是 Python 中用于数值计算的核心库,它提供了高性能的多维数组对象 ndarray。NumPy 数组在数据分析中广泛应用,因为它支持高效的向量化操作。

首先,需要安装并导入 NumPy 库:

import numpy as np

简单条件筛选

假设我们有一个 NumPy 数组表示学生的身高(单位:厘米),我们想筛选出身高超过 170 厘米的学生身高。

import numpy as np
heights = np.array([165, 172, 175, 168, 180])
tall_heights = []
for height in heights:
    if height > 170:
        tall_heights.append(height)
print(tall_heights)

这里使用了和列表类似的遍历方式结合 if 语句进行筛选。但在 NumPy 中,更高效的方式是使用布尔索引。

import numpy as np
heights = np.array([165, 172, 175, 168, 180])
tall_heights = heights[heights > 170]
print(tall_heights)

这里 heights > 170 生成一个布尔数组,其元素与 heights 数组对应位置的元素满足条件与否相关,为 TrueFalse。然后通过这个布尔数组作为索引,从 heights 数组中筛选出满足条件的元素。

多条件筛选

例如,我们想筛选出身高在 170 到 180 厘米之间(包括 170 和 180)的学生身高。

import numpy as np
heights = np.array([165, 172, 175, 168, 180])
selected_heights = heights[(heights >= 170) & (heights <= 180)]
print(selected_heights)

这里使用了 & 运算符连接两个条件,生成一个复合布尔数组,用于筛选出符合条件的身高。需要注意的是,在 NumPy 中不能直接使用 and 连接条件,而要使用 &;同理,or 对应的是 |

在 Pandas DataFrame 中的筛选应用

Pandas DataFrame 简介

Pandas 是 Python 中用于数据处理和分析的重要库,DataFrame 是其核心数据结构之一,它类似于电子表格或 SQL 表,是一个二维的、带标签的数据结构。

首先,导入 Pandas 库:

import pandas as pd

基于单列条件筛选

假设我们有一个包含学生信息的 DataFrame,如下:

data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 22, 21, 23],
    '成绩': [85, 90, 78, 88]
}
df = pd.DataFrame(data)

现在我们想筛选出成绩大于 80 的学生信息。

data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 22, 21, 23],
    '成绩': [85, 90, 78, 88]
}
df = pd.DataFrame(data)
filtered_df = df[df['成绩'] > 80]
print(filtered_df)

这里通过 df['成绩'] > 80 生成一个布尔序列,其长度与 DataFrame 的行数相同,对应每个行是否满足成绩大于 80 的条件。然后将这个布尔序列作为索引,从 df 中筛选出满足条件的行。

多列条件筛选

例如,我们想筛选出年龄大于 20 且成绩大于 85 的学生信息。

data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 22, 21, 23],
    '成绩': [85, 90, 78, 88]
}
df = pd.DataFrame(data)
filtered_df = df[(df['年龄'] > 20) & (df['成绩'] > 85)]
print(filtered_df)

这里同样使用 & 连接两个条件生成复合布尔序列进行筛选。

复杂条件筛选

  1. 使用 isin 方法 假设我们有一个新的需求,筛选出姓名在某个列表中的学生信息。比如筛选出姓名为 '张三' 和 '王五' 的学生。
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 22, 21, 23],
    '成绩': [85, 90, 78, 88]
}
df = pd.DataFrame(data)
names_list = ['张三', '王五']
filtered_df = df[df['姓名'].isin(names_list)]
print(filtered_df)

这里使用 isin 方法,它会检查 DataFrame 中指定列的元素是否在给定的列表中,返回一个布尔序列用于筛选。

  1. 使用 apply 方法结合自定义函数 有时我们需要更复杂的逻辑,这时候可以定义一个自定义函数,然后使用 apply 方法应用到 DataFrame 上。例如,根据成绩和年龄综合判断是否为优秀学生(假设成绩大于 85 且年龄小于 22 为优秀学生)。
data = {
    '姓名': ['张三', '李四', '王五', '赵六'],
    '年龄': [20, 22, 21, 23],
    '成绩': [85, 90, 78, 88]
}
df = pd.DataFrame(data)
def is_excellent(row):
    if row['成绩'] > 85 and row['年龄'] < 22:
        return True
    return False
df['是否优秀'] = df.apply(is_excellent, axis = 1)
excellent_students = df[df['是否优秀']]
print(excellent_students)

这里定义了 is_excellent 函数,它接受 DataFrame 的一行数据作为参数,根据条件判断是否为优秀学生。然后使用 apply 方法将这个函数应用到 DataFrame 的每一行(axis = 1 表示按行应用),生成一个新的列 是否优秀。最后根据这个新列筛选出优秀学生。

嵌套 if 语句在数据分析中的应用

嵌套 if 语句的基本结构

嵌套 if 语句就是在一个 if 语句块中再包含另一个 if 语句。例如:

num = 85
if num >= 60:
    if num >= 80:
        print("成绩良好")
    else:
        print("成绩及格")
else:
    print("成绩不及格")

这里外层 if 语句判断成绩是否及格,内层 if 语句在及格的基础上进一步判断是否良好。

在数据分析中的应用场景

  1. 更细致的数据分类 假设我们有一个包含不同商品销售数据的 DataFrame,数据如下:
sales_data = {
    '商品类别': ['电子产品', '服装', '食品', '电子产品', '服装'],
    '销售额': [1000, 500, 300, 1500, 800]
}
df = pd.DataFrame(sales_data)

我们想根据商品类别和销售额进行更细致的分类。比如,对于电子产品,销售额大于 1000 的标记为“高销售额电子产品”,否则为“一般销售额电子产品”;对于服装,销售额大于 600 的标记为“高销售额服装”,否则为“一般销售额服装”;对于食品,统一标记为“食品”。

sales_data = {
    '商品类别': ['电子产品', '服装', '食品', '电子产品', '服装'],
    '销售额': [1000, 500, 300, 1500, 800]
}
df = pd.DataFrame(sales_data)
def classify_product(row):
    if row['商品类别'] == '电子产品':
        if row['销售额'] > 1000:
            return '高销售额电子产品'
        else:
            return '一般销售额电子产品'
    elif row['商品类别'] == '服装':
        if row['销售额'] > 600:
            return '高销售额服装'
        else:
            return '一般销售额服装'
    else:
        return '食品'
df['分类'] = df.apply(classify_product, axis = 1)
print(df)

这里定义了 classify_product 函数,通过嵌套的 if 语句实现了根据商品类别和销售额的细致分类,然后使用 apply 方法应用到 DataFrame 的每一行。

  1. 多层筛选 假设我们有一个包含员工信息的 DataFrame,数据如下:
employee_data = {
    '部门': ['研发', '销售', '研发', '行政', '销售'],
    '工作年限': [3, 5, 2, 4, 3],
    '绩效评分': [8, 9, 7, 8, 9]
}
df = pd.DataFrame(employee_data)

我们想先筛选出研发部门的员工,然后在研发部门员工中筛选出工作年限大于 2 且绩效评分大于 7 的员工。

employee_data = {
    '部门': ['研发', '销售', '研发', '行政', '销售'],
    '工作年限': [3, 5, 2, 4, 3],
    '绩效评分': [8, 9, 7, 8, 9]
}
df = pd.DataFrame(employee_data)
研发部门_df = df[df['部门'] == '研发']
filtered_df = 研发部门_df[(研发部门_df['工作年限'] > 2) & (研发部门_df['绩效评分'] > 7)]
print(filtered_df)

这里先通过外层条件筛选出研发部门的员工,然后在这个子集中通过内层条件进一步筛选。虽然这里没有直接使用嵌套的 if 语句,但逻辑上是类似的多层筛选过程。

优化 if 语句在数据分析中的使用

避免不必要的 if 语句

  1. 使用布尔索引替代显式循环和 if 语句 在 NumPy 和 Pandas 中,尽量使用布尔索引而不是通过显式的 for 循环结合 if 语句进行筛选。例如,在前面的 NumPy 数组筛选身高的例子中,使用布尔索引 heights[heights > 170] 比使用 for 循环遍历数组并使用 if 语句判断要高效得多。在 Pandas 中同样如此,如 df[df['成绩'] > 80] 这种方式比使用 for 循环遍历 DataFrame 行并判断更高效。
  2. 利用 Pandas 的向量化操作 Pandas 支持很多向量化操作,这些操作会在底层以高效的方式实现,避免了显式的循环和 if 语句。例如,计算 DataFrame 中某列数据的平方,可以直接使用 df['列名'] = df['列名'] ** 2,而不需要使用 for 循环和 if 语句逐行计算。

优化条件判断

  1. 合理安排条件顺序 当有多个条件时,将最有可能为 False 的条件放在前面。例如,假设我们有一个条件判断 if condition1 and condition2 and condition3,如果 condition1 最有可能为 False,那么先判断 condition1 可以在很多情况下快速跳过后续条件的判断,提高效率。
  2. 简化复合条件 尽量简化复合条件,避免复杂的逻辑嵌套。例如,将 if (a > 10 and b < 20) or (a < 5 and b > 30) 这种复杂条件,通过分析业务逻辑,看是否可以简化为更清晰、高效的条件。

使用字典映射替代复杂 if - elif 结构

当有多个互斥条件且根据不同条件执行不同操作时,可以考虑使用字典映射来替代复杂的 if - elif 结构。例如,假设根据不同的商品类别执行不同的价格调整操作:

商品类别 = '电子产品'
def 调整电子产品价格(price):
    return price * 1.1
def 调整服装价格(price):
    return price * 1.05
def 调整食品价格(price):
    return price * 1.02
类别价格调整函数 = {
    '电子产品': 调整电子产品价格,
    '服装': 调整服装价格,
    '食品': 调整食品价格
}
price = 100
新价格 = 类别价格调整函数[商品类别](price)
print(新价格)

这里通过字典将商品类别映射到相应的价格调整函数,比使用 if - elif 结构更加简洁和易于维护。在数据分析中,如果根据不同的列值执行不同的计算或筛选逻辑,这种方法同样适用。

实际案例分析

案例一:电商销售数据分析

  1. 数据描述 假设我们有一个电商销售数据的 DataFrame,包含以下列:订单编号客户 ID商品类别销售金额销售日期。数据如下:
sales_data = {
    '订单编号': ['001', '002', '003', '004', '005'],
    '客户 ID': ['C001', 'C002', 'C001', 'C003', 'C002'],
    '商品类别': ['电子产品', '服装', '电子产品', '食品', '服装'],
    '销售金额': [1000, 500, 1500, 300, 800],
    '销售日期': ['2023 - 01 - 01', '2023 - 01 - 02', '2023 - 01 - 03', '2023 - 01 - 04', '2023 - 01 - 05']
}
df = pd.DataFrame(sales_data)
  1. 分析需求
  • 筛选出销售金额大于 800 的订单信息。
  • 进一步筛选出电子产品类别且销售金额大于 1000 的订单信息。
  • 统计不同商品类别中销售金额大于 600 的订单数量。
  1. 实现代码
sales_data = {
    '订单编号': ['001', '002', '003', '004', '005'],
    '客户 ID': ['C001', 'C002', 'C001', 'C003', 'C002'],
    '商品类别': ['电子产品', '服装', '电子产品', '食品', '服装'],
    '销售金额': [1000, 500, 1500, 300, 800],
    '销售日期': ['2023 - 01 - 01', '2023 - 01 - 02', '2023 - 01 - 03', '2023 - 01 - 04', '2023 - 01 - 05']
}
df = pd.DataFrame(sales_data)
# 筛选出销售金额大于 800 的订单信息
filtered_df1 = df[df['销售金额'] > 800]
print("销售金额大于 800 的订单信息:")
print(filtered_df1)
# 进一步筛选出电子产品类别且销售金额大于 1000 的订单信息
filtered_df2 = df[(df['商品类别'] == '电子产品') & (df['销售金额'] > 1000)]
print("电子产品类别且销售金额大于 1000 的订单信息:")
print(filtered_df2)
# 统计不同商品类别中销售金额大于 600 的订单数量
category_count = {}
for category in df['商品类别'].unique():
    category_df = df[(df['商品类别'] == category) & (df['销售金额'] > 600)]
    category_count[category] = len(category_df)
print("不同商品类别中销售金额大于 600 的订单数量:")
print(category_count)

在这个案例中,通过不同的条件筛选和 if 语句相关的逻辑(这里主要是通过布尔索引实现类似 if 语句筛选效果),对电商销售数据进行了分析。

案例二:医疗数据分析

  1. 数据描述 假设有一个医疗数据的 DataFrame,包含患者的 ID年龄疾病类型治疗效果(取值为“治愈”、“好转”、“未改善”)等信息。数据如下:
medical_data = {
    '患者 ID': ['P001', 'P002', 'P003', 'P004', 'P005'],
    '年龄': [30, 45, 28, 55, 40],
    '疾病类型': ['感冒', '心脏病', '感冒', '糖尿病', '心脏病'],
    '治疗效果': ['治愈', '好转', '治愈', '未改善', '好转']
}
df = pd.DataFrame(medical_data)
  1. 分析需求
  • 筛选出年龄大于 40 岁的患者信息。
  • 进一步筛选出年龄大于 40 岁且疾病类型为心脏病的患者信息。
  • 根据治疗效果进行分类统计,即统计治愈、好转、未改善的患者数量。
  1. 实现代码
medical_data = {
    '患者 ID': ['P001', 'P002', 'P003', 'P004', 'P005'],
    '年龄': [30, 45, 28, 55, 40],
    '疾病类型': ['感冒', '心脏病', '感冒', '糖尿病', '心脏病'],
    '治疗效果': ['治愈', '好转', '治愈', '未改善', '好转']
}
df = pd.DataFrame(medical_data)
# 筛选出年龄大于 40 岁的患者信息
filtered_df1 = df[df['年龄'] > 40]
print("年龄大于 40 岁的患者信息:")
print(filtered_df1)
# 进一步筛选出年龄大于 40 岁且疾病类型为心脏病的患者信息
filtered_df2 = df[(df['年龄'] > 40) & (df['疾病类型'] == '心脏病')]
print("年龄大于 40 岁且疾病类型为心脏病的患者信息:")
print(filtered_df2)
# 根据治疗效果进行分类统计
treatment_count = {}
for treatment in df['治疗效果'].unique():
    treatment_df = df[df['治疗效果'] == treatment]
    treatment_count[treatment] = len(treatment_df)
print("根据治疗效果分类统计的患者数量:")
print(treatment_count)

通过这些案例可以看到,if 语句相关的筛选逻辑在实际数据分析中起着重要作用,能够帮助我们从复杂的数据中提取有价值的信息。无论是简单的条件筛选,还是基于多个条件的复杂筛选,都可以通过合理运用 if 语句及其相关技巧来实现高效的数据分析。同时,在实际应用中要根据数据特点和分析需求,灵活选择合适的方法,以达到最佳的分析效果。在处理大规模数据时,更要注重优化筛选逻辑,提高代码的执行效率。