用Python进行AI数据分析进阶教程27:
用pandas库进行数据筛选、排序和分组
关键词:数据筛选、布尔索引、数据排序、分组聚合、pandas库
摘要:本文介绍了如何使用 Python 中的 pandas 库进行数据筛选、排序和分组操作。首先通过创建一个学生信息的数据集作为示例,随后详细讲解了按条件和索引进行数据筛选的方法,强调使用布尔索引和逻辑运算符组合多个条件。接着介绍了按列值对数据进行排序,包括单列排序和多列排序的不同场景及实现方式。最后,文章重点说明了如何通过 groupby 方法进行数据分组,并结合 agg 和 size 方法实现对分组后数据的聚合与统计。文章内容实用,适合初学者掌握 pandas 数据处理的基本技巧,并提供了完整的代码示例和注释,便于理解和应用。
👉 欢迎订阅🔗
《用Python进行AI数据分析进阶教程》专栏
《AI大模型应用实践进阶教程》专栏
《Python编程知识集锦》专栏
《字节跳动旗下AI制作抖音视频》专栏
《智能辅助驾驶》专栏
《工具软件及IT技术集锦》专栏
以下是关于pandas库数据筛选、排序和分组的详细介绍,包含各种方式、关键点、注意点以及示例代码,并在每句代码后添加注释并说明输出结果。
一、数据准备
首先,我们需要创建一个示例数据集来进行后续的操作。
python脚本
# 导入 pandas 库,该库用于数据处理和分析
import pandas as pd
# 创建一个包含学生信息的字典,字典的键是列名,值是对应列的数据列表
data = {
# 学生姓名列
'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
# 学生年龄列
'Age': [20, 21, 19, 22, 20],
# 学生分数列
'Score': [85, 90, 78, 92, 88],
# 学生性别列
'Gender': ['F', 'M', 'M', 'M', 'F']
}
# 使用 pandas 的 DataFrame 函数将字典 data 转换为二维表格数据结构,存储在变量 df 中
df = pd.DataFrame(data)
# 打印提示信息,表明接下来要打印的是原始数据集
print('原始数据集:')
# 打印原始数据集,即 df 这个 DataFrame 对象
print(df)
# 输出结果如下:
# 原始数据集:
# Name Age Score Gender
# 0 Alice 20 85 F
# 1 Bob 21 90 M
# 2 Charlie 19 78 M
# 3 David 22 92 M
# 4 Eve 20 88 F
二、数据筛选
1、按条件筛选
Python脚本
# 筛选出年龄大于20岁的学生
# df['Age'] > 20 会生成一个布尔型的Series,用于判断每一行的年龄是否大于20
# df[df['Age'] > 20] 利用这个布尔型Series筛选出满足条件(年龄大于20)的行,结果存储在 filtered_df 中
filtered_df = df[df['Age'] > 20]
# 打印提示信息,表明接下来要打印年龄大于20岁的学生信息
print('\n年龄大于20岁的学生:')
# 打印筛选出的年龄大于20岁的学生信息
print(filtered_df)
# 输出结果:
# 年龄大于20岁的学生:
# Name Age Score Gender
# 1 Bob 21 90 M
# 3 David 22 92 M
# 筛选出性别为女性且分数大于85分的学生
# df['Gender'] == 'F' 生成一个布尔型Series,判断每一行的性别是否为 'F'
# df['Score'] > 85 生成一个布尔型Series,判断每一行的分数是否大于85
# (df['Gender'] == 'F') & (df['Score'] > 85) 使用逻辑与运算符 & 组合两个条件,得到一个新的布尔型Series
# df[(df['Gender'] == 'F') & (df['Score'] > 85)] 利用这个新的布尔型Series筛选出满足两个条件的行,结果存储在 filtered_df2 中
filtered_df2 = df[(df['Gender'] == 'F') & (df['Score'] > 85)]
# 打印提示信息,表明接下来要打印性别为女性且分数大于85分的学生信息
print('\n性别为女性且分数大于85分的学生:')
# 打印筛选出的性别为女性且分数大于85分的学生信息
print(filtered_df2)
# 输出结果:
# 性别为女性且分数大于85分的学生:
# Name Age Score Gender
# 4 Eve 20 88 F
关键点:
- 使用布尔索引进行筛选,布尔表达式的结果是一个布尔型的Series,用于选择满足条件的行。
- 多个条件筛选时,使用&(与)、|(或)等逻辑运算符连接条件。
注意点:
- 逻辑运算符两边的条件需要用括号括起来,以避免运算顺序错误。
2、按索引筛选
python脚本
# 筛选出第2行到第3行的数据
# 这里使用切片操作从DataFrame对象df中
# 选取第2行(索引为1)到第3行(索引为3,不包含)的数据
# 并将选取的数据赋值给新的DataFrame对象subset_df
subset_df = df[1:3]
# 打印提示信息,说明接下来要输出的是第2行到第3行的数据
print('\n第2行到第3行的数据:')
# 打印选取的第2行到第3行的数据,会显示DataFrame的内容,包括列名和对应的数据
# 输出结果会展示出第2行和第3行的所有列的数据
print(subset_df)
# 输出结果:
# 第2行到第3行的数据:
# Name Age Score Gender
# 1 Bob 21 90 M
# 2 Charlie 19 78 M
关键点:
- 使用切片操作可以按行索引筛选数据。
注意点:
- 切片操作是左闭右开的,即包含起始索引,不包含结束索引。
三、数据排序
1、按列值排序
python脚本
# 按分数从高到低排序
# 使用 DataFrame 的 sort_values 方法对 DataFrame 对象 df 进行排序
# by='Score' 表示按照 'Score' 这一列进行排序
# ascending=False 表示降序排序,即从大到小排列
# 排序后的结果存储在新的 DataFrame 对象 sorted_df 中
sorted_df = df.sort_values(by='Score', ascending=False)
# 打印提示信息,说明接下来要输出的是按分数从高到低排序后的数据集
print('\n按分数从高到低排序:')
# 打印按分数从高到低排序后的数据集
# 输出结果会展示一个 DataFrame,其中的数据按照 'Score' 列从大到小排列
# 输出会包含所有列,行索引可能会打乱,因为排序是根据分数重新排列行的顺序
print(sorted_df)
# 输出结果:
# 按分数从高到低排序:
# Name Age Score Gender
# 3 David 22 92 M
# 1 Bob 21 90 M
# 4 Eve 20 88 F
# 0 Alice 20 85 F
# 2 Charlie 19 78 M
# 按年龄升序排序,如果年龄相同则按分数降序排序
# 使用 DataFrame 的 sort_values 方法对 DataFrame 对象 df 进行排序
# by=['Age', 'Score'] 表示先按照 'Age' 列排序,再按照 'Score' 列排序
# ascending=[True, False] 表示 'Age' 列按升序(从小到大)排序,'Score' 列按降序(从大到小)排序
# 排序后的结果存储在新的 DataFrame 对象 sorted_df2 中
sorted_df2 = df.sort_values(by=['Age', 'Score'], ascending=[True, False])
# 打印提示信息,说明接下来要输出的是按年龄升序、年龄相同时按分数降序排序后的数据集
print('\n按年龄升序排序,如果年龄相同则按分数降序排序:')
# 打印按年龄升序、年龄相同时按分数降序排序后的数据集
# 输出结果会展示一个 DataFrame,先按 'Age' 列从小到大排列,当 'Age' 相同时,按 'Score' 列从大到小排列
# 输出会包含所有列,行索引可能会打乱,因为排序是根据指定规则重新排列行的顺序
print(sorted_df2)
# 输出结果:
# 按年龄升序排序,如果年龄相同则按分数降序排序:
# Name Age Score Gender
# 2 Charlie 19 78 M
# 0 Alice 20 85 F
# 4 Eve 20 88 F
# 1 Bob 21 90 M
# 3 David 22 92 M
关键点:
- sort_values方法的by参数指定按哪一列或哪些列进行排序。
- ascending参数指定排序的顺序,True表示升序,False表示降序。
注意点:
- 当按多列排序时,ascending参数需要传入一个布尔列表,分别对应每一列的排序顺序。
四、数据分组
1、按单列分组
python脚本
# 按性别分组,计算每组的平均年龄和平均分数
# 使用 DataFrame 的 groupby 方法,按照 'Gender' 列对 DataFrame 对象 df 进行分组
# 分组后,使用 agg 方法对每个分组进行聚合操作
# {'Age': 'mean', 'Score': 'mean'} 表示对 'Age' 列和 'Score' 列分别计算平均值
# 最终的聚合结果存储在新的 DataFrame 对象 grouped 中
grouped = df.groupby('Gender').agg({'Age': 'mean', 'Score': 'mean'})
# 打印提示信息,说明接下来要输出的是按性别分组后,每组的平均年龄和平均分数
print('\n按性别分组,计算每组的平均年龄和平均分数:')
# 打印按性别分组后的聚合结果
# 输出结果会展示一个新的 DataFrame,索引为 'Gender' 列的不同取值(如 'F' 和 'M')
# 包含两列,分别是 'Age' 列的平均值和 'Score' 列的平均值
# 每一行代表一个性别的分组,显示该分组下年龄和分数的平均值
print(grouped)
# 输出结果:
# 按性别分组,计算每组的平均年龄和平均分数:
# Age Score
# Gender
# F 20.0 86.5
# M 20.666667 86.666667
2、按多列分组
python脚本
# 按性别和年龄分组,计算每组的人数
# 使用 DataFrame 的 groupby 方法对 DataFrame 对象 df 进行分组
# 这里按照 'Gender'(性别)和 'Age'(年龄)这两列进行分组,
# 意味着会将数据按照性别和年龄的不同组合进行划分
# 分组后使用 size() 方法,该方法会统计每个分组中的元素数量,也就是每组的人数
# 最终结果存储在变量 grouped2 中,它是一个 Series 对象,
# 索引是由性别和年龄的组合构成,值是每组的人数
grouped2 = df.groupby(['Gender', 'Age']).size()
# 打印提示信息,表明接下来要输出的是按性别和年龄分组后每组的人数
print('\n按性别和年龄分组,计算每组的人数:')
# 打印按性别和年龄分组后每组的人数
# 输出结果会显示一个 Series,其索引是 MultiIndex 类型,
# 包含 'Gender' 和 'Age' 两个层次
# 每个索引组合对应的值就是该性别和年龄组合下的人数
print(grouped2)
# 输出结果:
# 按性别和年龄分组,计算每组的人数:
# Gender Age
# F 20 2
# M 19 1
# 21 1
# 22 1
关键点:
- groupby方法用于将数据按指定列进行分组。
- agg方法用于对分组后的数据进行聚合操作,可以指定不同列的聚合函数。
- size方法用于计算每组的元素个数。
注意点:
- 分组后的结果是一个GroupBy对象,需要进行聚合操作才能得到最终的结果。
通过以上示例,你可以了解pandas库中数据筛选、排序和分组的基本操作和注意事项。
——The END——
🔗 欢迎订阅专栏
序号 | 专栏名称 | 说明 |
---|---|---|
1 | 用Python进行AI数据分析进阶教程 | 《用Python进行AI数据分析进阶教程》专栏 |
2 | AI大模型应用实践进阶教程 | 《AI大模型应用实践进阶教程》专栏 |
3 | Python编程知识集锦 | 《Python编程知识集锦》专栏 |
4 | 字节跳动旗下AI制作抖音视频 | 《字节跳动旗下AI制作抖音视频》专栏 |
5 | 智能辅助驾驶 | 《智能辅助驾驶》专栏 |
6 | 工具软件及IT技术集锦 | 《工具软件及IT技术集锦》专栏 |
👉 关注我 @理工男大辉郎 获取实时更新
欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589