Python if语句在数据分析中的筛选逻辑
Python if 语句基础
if 语句语法结构
在 Python 中,if
语句用于根据条件执行不同的代码块。其基本语法如下:
if condition:
# 当条件为 True 时执行的代码
statement1
statement2
# 可以有多个语句
这里的 condition
是一个表达式,它会被求值为 True
或 False
。如果 condition
为 True
,则缩进块中的代码(statement1
、statement2
等)将被执行;如果为 False
,则这些代码块将被跳过。
例如,判断一个数字是否大于 10:
num = 15
if num > 10:
print(f"{num} 大于 10")
在这个例子中,num > 10
是条件,当这个条件为 True
时,会执行 print
语句。
if - else 结构
if - else
结构允许在条件为 True
和 False
时分别执行不同的代码块。语法如下:
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
结构用于处理多个互斥条件。elif
是 else 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]
筛选符合条件的数据
- 筛选出及格成绩
我们可以使用
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
列表中。
- 筛选出优秀成绩(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
数组对应位置的元素满足条件与否相关,为 True
或 False
。然后通过这个布尔数组作为索引,从 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)
这里同样使用 &
连接两个条件生成复合布尔序列进行筛选。
复杂条件筛选
- 使用
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
中指定列的元素是否在给定的列表中,返回一个布尔序列用于筛选。
- 使用
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
语句在及格的基础上进一步判断是否良好。
在数据分析中的应用场景
- 更细致的数据分类
假设我们有一个包含不同商品销售数据的
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
的每一行。
- 多层筛选
假设我们有一个包含员工信息的
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 语句
- 使用布尔索引替代显式循环和 if 语句
在 NumPy 和 Pandas 中,尽量使用布尔索引而不是通过显式的
for
循环结合if
语句进行筛选。例如,在前面的 NumPy 数组筛选身高的例子中,使用布尔索引heights[heights > 170]
比使用for
循环遍历数组并使用if
语句判断要高效得多。在 Pandas 中同样如此,如df[df['成绩'] > 80]
这种方式比使用for
循环遍历DataFrame
行并判断更高效。 - 利用 Pandas 的向量化操作
Pandas 支持很多向量化操作,这些操作会在底层以高效的方式实现,避免了显式的循环和
if
语句。例如,计算DataFrame
中某列数据的平方,可以直接使用df['列名'] = df['列名'] ** 2
,而不需要使用for
循环和if
语句逐行计算。
优化条件判断
- 合理安排条件顺序
当有多个条件时,将最有可能为
False
的条件放在前面。例如,假设我们有一个条件判断if condition1 and condition2 and condition3
,如果condition1
最有可能为False
,那么先判断condition1
可以在很多情况下快速跳过后续条件的判断,提高效率。 - 简化复合条件
尽量简化复合条件,避免复杂的逻辑嵌套。例如,将
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
结构更加简洁和易于维护。在数据分析中,如果根据不同的列值执行不同的计算或筛选逻辑,这种方法同样适用。
实际案例分析
案例一:电商销售数据分析
- 数据描述
假设我们有一个电商销售数据的
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)
- 分析需求
- 筛选出销售金额大于 800 的订单信息。
- 进一步筛选出电子产品类别且销售金额大于 1000 的订单信息。
- 统计不同商品类别中销售金额大于 600 的订单数量。
- 实现代码
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
语句筛选效果),对电商销售数据进行了分析。
案例二:医疗数据分析
- 数据描述
假设有一个医疗数据的
DataFrame
,包含患者的ID
、年龄
、疾病类型
、治疗效果
(取值为“治愈”、“好转”、“未改善”)等信息。数据如下:
medical_data = {
'患者 ID': ['P001', 'P002', 'P003', 'P004', 'P005'],
'年龄': [30, 45, 28, 55, 40],
'疾病类型': ['感冒', '心脏病', '感冒', '糖尿病', '心脏病'],
'治疗效果': ['治愈', '好转', '治愈', '未改善', '好转']
}
df = pd.DataFrame(medical_data)
- 分析需求
- 筛选出年龄大于 40 岁的患者信息。
- 进一步筛选出年龄大于 40 岁且疾病类型为心脏病的患者信息。
- 根据治疗效果进行分类统计,即统计治愈、好转、未改善的患者数量。
- 实现代码
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
语句及其相关技巧来实现高效的数据分析。同时,在实际应用中要根据数据特点和分析需求,灵活选择合适的方法,以达到最佳的分析效果。在处理大规模数据时,更要注重优化筛选逻辑,提高代码的执行效率。