27、用pandas库进行数据筛选、排序和分组【用Python进行AI数据分析进阶教程】

用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数据分析进阶教程》专栏
2AI大模型应用实践进阶教程《AI大模型应用实践进阶教程》专栏
3Python编程知识集锦《Python编程知识集锦》专栏
4字节跳动旗下AI制作抖音视频《字节跳动旗下AI制作抖音视频》专栏
5智能辅助驾驶《智能辅助驾驶》专栏
6工具软件及IT技术集锦《工具软件及IT技术集锦》专栏

👉 关注我 @理工男大辉郎 获取实时更新

欢迎关注、收藏或转发。
敬请关注 我的
微信搜索公众号:cnFuJH
CSDN博客:理工男大辉郎
抖音号:31580422589

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

理工男大辉郎

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值