如何用Python Pandas按col1分组获取col3前3最大值并显示col2
问题描述
给定如下数据集:
| col1 | col2 | col3 |
|---|---|---|
| category1 | subcat1 | 10 |
| category1 | subcat2 | 15 |
| category1 | subcat3 | 1 |
| category1 | subcat4 | 23 |
| category2 | subcat1 | 10 |
| category2 | subcat2 | 99 |
| category2 | subcat3 | 23 |
| category2 | subcat4 | 12 |
| category2 | subcat5 | 10 |
| category2 | subcat6 | 11 |
| category2 | subcat7 | 45 |
| category2 | subcat8 | 105 |
| category3 | subcat1 | 2 |
| category3 | subcat2 | 9 |
| category3 | subcat3 | 14 |
| category3 | subcat4 | 25 |
| ... | ... | ... |
需求:用Python Pandas实现按col1中的类别分组,每个组内获取col3的前3个最大值,同时显示对应的col2(子类别),输出格式如下:
category1: subcat4 23 subcat2 15 subcat1 10 category2: subcat8 105 subcat2 99 subcat7 45 category3: subcat4 25 subcat3 14 subcat2 9
实现步骤
导入Pandas库
先导入处理表格数据的核心库:import pandas as pd创建/读取数据集
可以用字典构造示例数据,也可以从文件读取(比如用pd.read_csv('你的文件路径.csv')):# 构造示例数据 data = { 'col1': ['category1']*4 + ['category2']*8 + ['category3']*4, 'col2': ['subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat5', 'subcat6', 'subcat7', 'subcat8', 'subcat1', 'subcat2', 'subcat3', 'subcat4'], 'col3': [10,15,1,23,10,99,23,12,10,11,45,105,2,9,14,25] } df = pd.DataFrame(data)分组并筛选前3大值
按col1分组,对每个组按col3降序排序后取前3行:# 分组后排序取前3 top3_per_group = df.groupby('col1', group_keys=False).apply( lambda x: x.sort_values('col3', ascending=False).head(3) )按需求格式输出
遍历每个分组,打印出对应的类别、子类别和数值:# 按指定格式输出 for category in top3_per_group.index.unique(): print(f"{category}:") group_data = top3_per_group.loc[category] for _, row in group_data.iterrows(): print(f" {row['col2']} {row['col3']}")
完整代码
整合所有步骤的完整代码:
import pandas as pd # 构造数据(实际使用时可替换为pd.read_csv('your_file.csv')) data = { 'col1': ['category1']*4 + ['category2']*8 + ['category3']*4, 'col2': ['subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat1', 'subcat2', 'subcat3', 'subcat4', 'subcat5', 'subcat6', 'subcat7', 'subcat8', 'subcat1', 'subcat2', 'subcat3', 'subcat4'], 'col3': [10,15,1,23,10,99,23,12,10,11,45,105,2,9,14,25] } df = pd.DataFrame(data) # 分组筛选前3大值 top3_per_group = df.groupby('col1', group_keys=False).apply( lambda x: x.sort_values('col3', ascending=False).head(3) ) # 按指定格式输出 for category in top3_per_group.index.unique(): print(f"{category}:") group_data = top3_per_group.loc[category] for _, row in group_data.iterrows(): print(f" {row['col2']} {row['col3']}")
运行代码后即可得到符合需求的输出。
内容的提问来源于stack exchange,提问作者Anton
相关产品推荐
相关产品推荐

