如何在Pandas DataFrame中筛选各分类下销量Top2的记录?
Pandas 按分类筛选销量前2的产品
示例数据
先构造你提供的示例DataFrame:
import pandas as pd df = pd.DataFrame({ 'Category': ['A','A','A','B','B','B'], 'Products': ['abc','xyz','def','nop','hjk','qrs'], 'Sales': [1,2,3,4,5,2] })
需求说明
无需循环迭代,筛选出每个Category分组下Sales排名前2的Products。
解决方案
方法1:groupby + nlargest(最简便)
直接对每个分组调用nlargest提取销量前2的行:
result = df.groupby('Category').apply(lambda x: x.nlargest(2, 'Sales')).reset_index(drop=True)
groupby('Category'):按分类字段分组nlargest(2, 'Sales'):在每个分组内取出销量最高的2条记录reset_index(drop=True):重置结果索引,避免多级索引干扰
方法2:rank函数筛选
通过给每个分组内的销量排名,再筛选排名前2的记录:
# 按分组给销量降序排名,method='first'处理并列值(按出现顺序排序) df['sales_rank'] = df.groupby('Category')['Sales'].rank(ascending=False, method='first') # 筛选排名<=2的记录,删除辅助列 result = df[df['sales_rank'] <= 2].drop('sales_rank', axis=1)
输出结果
最终得到的result如下:
| Category | Products | Sales |
|---|---|---|
| A | def | 3 |
| A | xyz | 2 |
| B | hjk | 5 |
| B | nop | 4 |
内容的提问来源于stack exchange,提问作者TMK
相关产品推荐
相关产品推荐

