15. df[逻辑表达式]选取数据

文摘   教育   2023-10-06 00:24   云南  

【目录】


  • 1. 知识回顾-索引取值

  • 1.1 什么是索引?

  • 1.2 索引取值

  • 2. 知识回顾-布尔值

  • 3. 逻辑表达式

  • 4. 布尔索引定义

  • 5. 布尔索引语法

  • 6. 知识回顾-df['列索引']获取特定列的数据

  • 7. `df[逻辑表达式]`选取数据

  • 8. 实操练习


【正文】


学习时间:30分钟。

1. 知识回顾-索引取值

1.1 什么是索引?

索引就是序列中的每个元素都对应的一个编号。

索引有正索引和负索引2种。

正数索引从左往右计数,负数索引从右往左计数。

正数索引从0开始编号,负数索引从-1开始编号。

例如,索引0表示序列中的第一个元素。

例如,索引-1表示序列中的最后一个元素。

1.2 索引取值

【语法】

s[0]
  • 序列名。
  • 英文中括号[]
  • 索引值。

[ ]英文中括号通常也称为索引操作符。

【代码示例:字符串索引取值】

# 将字符串Hello赋值给变量a
a = 'Hello'

# 序列名为a
# 索引操作符:英文中括号[]
# 索引值为0,取到字符串的第1个元素H
print(a[0])

【终端输出】

H

【代码示例:列表索引取值】

# 新建一个str列表
str_list = ["当归""人参",  "黄芪"]

# 序列名为str_list
# 索引操作符:英文中括号[]
# 索引值为1,取到列表的第2个元素人参
print(str_list[1])

【终端输出】

人参

索引相关知识可参考下面的链接:

24. python 字符串索引取值

27. Python 列表的索引取值

2. 知识回顾-布尔值

布尔值是根据逻辑判断的结果而产生的值。

True 和 False,就叫做布尔值。

注意:True 和 False 不加引号,且首字母要大写!!!

3. 逻辑表达式

逻辑表达式用于将多个条件组合在一起,结果返回True或False。

常见的逻辑表达式有以下三种形式:

  • 逻辑与:a and b

  • 逻辑或:a or b

  • 逻辑非:not b

  • 逻辑与表达式(a and b):用于检查a和b是否都为True。只有当a和b都为True时,表达式的值才为True。

  • 逻辑或表达式(a or b):用于检查a和b是否至少有一个为True。只要a和b中至少有一个为True,表达式的值就为True。

  • 逻辑非表达式(not b):用于对b的值取反。如果b为False,则返回True;如果b为True,则返回False。

【代码示例】

print(True and False)
print(True or False)
print(not False)

【终端输出】

False
True
True

相关知识可参考如下基础知识笔记:

17. Python 逻辑运算

4. 布尔索引定义

布尔索引是一种使用布尔值(True或False)作为索引值来获取数组、DataFrame或其他数据结构中元素的方法。

我们把这句话拆开来看:

  • 索引值 = 布尔值(True或False)
  • 对象:数组、DataFrame
  • 作用:获取数据结构的元素

【字符串索引】

  • 索引值:元素的编号。
  • 对象:字符串。
  • 作用:字符串。

【作用】

布尔索引的作用是根据指定的条件来选择满足条件的元素。

通常用于过滤选择删除数据。

5. 布尔索引语法

df[逻辑表达式]
  • df是要操作的对象,即DataFrame,也可以替换成其他的数据结构。
  • []是索引操作符。
  • 索引值:布尔值(True或False)
  • 逻辑表达式返回的结果就是布尔值。

布尔索引的参数是逻辑表达式,可以使用比较运算符(如==、>、<等)、逻辑运算符(如and、or、not等)和各种函数来构建复杂的条件。

【返回值】

返回一个布尔数组。

数组中的每个元素代表对应位置的元素是否满足条件。

通过将布尔数组作为索引值,可以选择满足条件的元素。

6. 知识回顾-df['列索引']获取特定列的数据

【代码示例】

# 导入pandas库并简写为pd
import pandas as pd

# 创建一个字典,包含要添加到DataFrame的数据
# 姓名 性别 年龄是字典的键,对应DataFrame的列索引
# ['赵', '钱', '孙', '李']字典的值,对应DataFrame的数据
data = {'姓名': ['赵''钱''孙''李'],
        '性别': ["男""男""女","女"],
        '年龄': [20253035]}

# 使用字典数据创建DataFrame对象
# pd库名,DataFrame类名
# 实例化对象语法:对象=类名( )
df = pd.DataFrame(data)
print(df)

【终端输出】

  姓名 性别  年龄
0 赵 男 20
1 钱 男 25
2 孙 女 30
3 李 女 35

df[列索引]获取数据】

# 获取年龄列的数据
print(df['年龄'])

【终端输出】

0    20
1 25
2 30
3 35
Name: 年龄, dtype: int64

7. df[逻辑表达式]选取数据

【目标任务】

获取上面df对象中年龄一列大于25的数据。

【条件表达式】

条件表达式可以设置成 df['年龄'] > 25

【代码示例】

condition = df['年龄'] > 25
result = df[condition]
print(result)

【终端输出】

  姓名 性别  年龄
2 孙 女 30
3 李 女 35

【查看condition】

condition = df['年龄'] > 25
print(condition)
print(type(condition))

【终端输出】

0    False
1 False
2 True
3 True
Name: 年龄, dtype: bool
<class 'pandas.core.series.Series'>

【代码解析】

df['年龄']获取到了年龄这一列的所有数据。

df['年龄']>25相当于给年龄列中的每一个数据都进行了一次比较运算,每一次比较的值大于25,结果就是 True; 小于等于25 结果就是 False,最终的运算结果以 Series 对象的形式进行返回。

df[condition]通过Series对象去索引 df 数据,将结果为 True 对应位置的数据提取出来。

【完整代码1】

将逻辑表达式赋值给变量,将变量作为布尔索引的参数:

import pandas as pd

data = {'姓名': ['赵''钱''孙''李'],
        '性别': ["男""男""女","女"],
        '年龄': [20253035]}
df = pd.DataFrame(data)
# 筛选条件:逻辑表达式
condition = df['年龄'] > 25
# 布尔索引选取数据
result = df[condition]
print(result)

【终端输出】

  姓名 性别  年龄
2 孙 女 30
3 李 女 35

【完整代码2】

直接把逻辑表达式作为布尔索引的参数:

import pandas as pd

data = {'姓名': ['赵''钱''孙''李'],
        '性别': ["男""男""女","女"],
        '年龄': [20253035]}
df = pd.DataFrame(data)
# 布尔索引:选取数据
result = df[df['年龄'] > 25]
print(result)

【终端输出】

  姓名 性别  年龄
2 孙 女 30
3 李 女 35

df[df['年龄'] > 25]提取出来的数据就是年龄大于25的数据。

8. 实操练习

【目标任务】

成绩表.xlsx存储有10名学生的成绩。

成绩在0-100之间属于正常。

老师在统计成绩的时候可能出现了统计错误。

要求用布尔索引输出0-100之间的成绩。

【读取文件,创建df对象】

# 读取pandas库并简写为pd
import pandas as pd

# 文件的绝对路径
file = r"D:\安迪笔记\4.数据分析\15\成绩表.xlsx"

# sheet_name ="学生",读取学生sheet里的数据
df = pd.read_excel(file, sheet_name ="学生")

print(df)

【终端输出】

   序号       学号  籍贯 性别   成绩
0 1 2023001 广东 男 -95
1 2 2023002 河南 男 96
2 3 2023003 湖北 男 97
3 4 2023004 广东 男 98
4 5 2023005 河南 男 99
5 6 2023006 河南 男 100
6 7 2023007 湖北 女 101
7 8 2023008 广东 女 102
8 9 2023009 河南 女 103
9 10 2023010 湖北 女 104

【1.统计输出小于等于100的成绩】

condition = df['成绩'] <= 100
df_1 = df[condition]
print(df_1)

【终端输出】

   序号       学号  籍贯 性别   成绩
0 1 2023001 广东 男 -95
1 2 2023002 河南 男 96
2 3 2023003 湖北 男 97
3 4 2023004 广东 男 98
4 5 2023005 河南 男 99
5 6 2023006 河南 男 100

【2.统计输出大于0的成绩】

condition = df_1['成绩'] >= 0
df_2 = df_1[condition]
print(df_2)

【终端输出】

   序号       学号  籍贯 性别   成绩
1 2 2023002 河南 男 96
2 3 2023003 湖北 男 97
3 4 2023004 广东 男 98
4 5 2023005 河南 男 99
5 6 2023006 河南 男 100

上面的代码我们分了2步走,先选出小于等于100的数据,赋值给变量df_1,然后在df_1中选出大于等于0的数据。

【一次性完成筛选】

除了分2步走,我们还可以利用&一次性完成数据筛选。

condition = ((0 <= df['成绩'])  & (df['成绩'] <= 100))
result = df[condition]
print(result)

【终端输出】

   序号       学号  籍贯 性别   成绩
1 2 2023002 河南 男 96
2 3 2023003 湖北 男 97
3 4 2023004 广东 男 98
4 5 2023005 河南 男 99
5 6 2023006 河南 男 100

【代码总结】

# 读取pandas库并简写为pd
import pandas as pd

# 文件的绝对路径
file = r"D:\安迪笔记\4.数据分析\15\成绩表.xlsx"

# sheet_name ="学生",读取学生sheet里的数据
df = pd.read_excel(file, sheet_name ="学生")

condition = ((0 <= df['成绩'])  & (df['成绩'] <= 100))
result = df[condition]
print(result)

【终端输出】

   序号       学号  籍贯 性别   成绩
1 2 2023002 河南 男 96
2 3 2023003 湖北 男 97
3 4 2023004 广东 男 98
4 5 2023005 河南 男 99
5 6 2023006 河南 男 100


安迪python学习笔记
python学习笔记,适合初学者。
 最新文章