从 Pandas DataFrame 中按类别选取 Top N 行

碧海醫心
发布: 2025-08-14 17:38:19
原创
725人浏览过

从 pandas dataframe 中按类别选取 top n 行

本文旨在介绍如何使用 Pandas 库,针对 DataFrame 数据,按照特定类别进行分组,并选取每个类别中排序靠前的 N 行数据。通过 groupby() 和 head() 函数的配合使用,可以高效地实现这一目标,从而方便进行数据筛选和分析。本文将提供详细的代码示例和解释,帮助读者掌握这一实用技巧。

在数据分析任务中,经常需要根据某些类别对数据进行分组,并选取每个类别中具有代表性的数据子集。例如,在一个包含学生姓名、科目和分数的 DataFrame 中,我们可能需要选取每个科目中成绩最高的几位学生。Pandas 库提供了强大的 groupby() 方法和 head() 方法,可以轻松实现这一目标。

使用 groupby() 和 head() 选取 Top N 行

以下代码演示了如何使用 groupby() 和 head() 函数选取每个类别中的前 N 行数据。

import pandas as pd

# 创建示例 DataFrame
data = [['Tom', 'A', 10], ['Jack', 'A', 9], ['Andy', 'A', 8],
        ['Lily', 'A', 7], ['Johan', 'B', 10], ['Ewa', 'B', 9],
        ['Alice', 'B', 8], ['Bob', 'B', 7], ['Charlie', 'C', 10]]

df = pd.DataFrame(data, columns=['Name', 'Category', 'Score'])

# 按照 'Category' 列进行分组,并选取每个类别的前 3 行
top3_category = df.groupby('Category').head(3)

# 打印结果
print(top3_category)
登录后复制

代码解释:

  1. import pandas as pd: 导入 Pandas 库,并将其命名为 pd。
  2. data = [...]: 定义一个包含姓名、类别和分数的列表。
  3. df = pd.DataFrame(data, columns=['Name', 'Category', 'Score']): 使用列表 data 创建一个 DataFrame,并指定列名为 'Name', 'Category', 'Score'。
  4. df.groupby('Category'): 使用 'Category' 列对 DataFrame 进行分组。groupby() 方法返回一个 DataFrameGroupBy 对象。
  5. .head(3): 对每个分组,选取前 3 行数据。head(n) 方法返回每个分组的前 n 行数据。如果分组中的行数少于 n,则返回分组中的所有行。
  6. print(top3_category): 打印结果 DataFrame,其中包含每个类别的前 3 行数据。

输出结果:

    Name Category  Score
0    Tom        A     10
1   Jack        A      9
2   Andy        A      8
4  Johan        B     10
5    Ewa        B      9
6  Alice        B      8
8  Charlie        C     10
登录后复制

可以看到,结果 DataFrame 包含了类别 'A' 的前 3 行,类别 'B' 的前 3 行,以及类别 'C' 的所有行(因为类别 'C' 只有一行)。

行者AI
行者AI

行者AI绘图创作,唤醒新的灵感,创造更多可能

行者AI 100
查看详情 行者AI

进阶用法:结合 sort_values() 排序后选取

如果需要根据特定列的值进行排序后再选取 Top N 行,可以结合 sort_values() 方法。

import pandas as pd

# 创建示例 DataFrame
data = [['Tom', 'A', 10], ['Jack', 'A', 9], ['Andy', 'A', 8],
        ['Lily', 'A', 7], ['Johan', 'B', 10], ['Ewa', 'B', 9],
        ['Alice', 'B', 8], ['Bob', 'B', 7], ['Charlie', 'C', 10]]

df = pd.DataFrame(data, columns=['Name', 'Category', 'Score'])

# 按照 'Category' 分组,并在每个组内按照 'Score' 降序排序,然后选取前 2 行
top2_by_score = df.groupby('Category').apply(lambda x: x.sort_values('Score', ascending=False).head(2))

# 打印结果
print(top2_by_score)
登录后复制

代码解释:

  1. df.groupby('Category').apply(...): 对 DataFrame 按照 'Category' 列进行分组,并对每个分组应用一个函数。
  2. lambda x: x.sort_values('Score', ascending=False).head(2): 定义一个匿名函数,该函数接收一个分组 x 作为输入,首先使用 sort_values('Score', ascending=False) 按照 'Score' 列进行降序排序,然后使用 head(2) 选取排序后的前 2 行。

输出结果:

       Name Category  Score
Category
A      0    Tom        A     10
       1   Jack        A      9
B      4  Johan        B     10
       5    Ewa        B      9
C      8  Charlie        C     10
登录后复制

可以看到,结果 DataFrame 包含了每个类别中 'Score' 最高的 2 行数据。

注意事项

  • groupby() 方法返回的是 DataFrameGroupBy 对象,需要结合其他方法(如 head(), apply(), agg() 等)才能得到最终结果。
  • head(n) 方法返回每个分组的前 n 行数据。如果分组中的行数少于 n,则返回分组中的所有行。
  • 使用 apply() 方法时,需要注意性能问题。对于大型 DataFrame,建议使用 Pandas 内置的聚合函数或矢量化操作来提高效率。
  • 在使用 sort_values() 方法时,需要注意排序的顺序(升序或降序)。

总结

本文介绍了如何使用 Pandas 的 groupby() 和 head() 函数,以及 sort_values() 函数,对 DataFrame 数据进行分组并选取每个类别中的 Top N 行数据。这些技巧在数据分析和处理中非常实用,可以帮助用户快速筛选和分析数据。通过灵活运用这些方法,可以高效地解决各种数据处理问题。

以上就是从 Pandas DataFrame 中按类别选取 Top N 行的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号