You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pandas获取数据集中每年各类型下价值最高的前2个名称

嘿,我来帮你搞定这个需求!要获取每年各类型下价值最高的前2个name,还得处理分组不足2条时补NULL的情况,咱们可以用pandas的分组、排序加上填充技巧来实现,具体步骤如下:

第一步:准备数据集

先把你的数据集代码放出来,方便后续操作:

import pandas as pd

z = pd.DataFrame.from_dict({
    'id':[1,2,3,4,5,6,7,8,9,10], 
    'name':['ax','bx','ayx','byz','ck','cl','akl','bwo','cop','bab'], 
    'value':[45,32,64,12,90,121,34,56,78,76], 
    'type':['x','y','x','y','z','z','y','z','x','z'], 
    'year':[1997,1998,1999,1999,1998,1997,1997,1998,1997,1997]
})

第二步:分组排序并标记组内排名

先对数据按year、type分组,每组内按value降序排序,然后给每组内的行分配序号(从0开始),只保留每组的前2条数据:

# 按年份、类型排序,组内按价值降序
z_sorted = z.sort_values(['year', 'type', 'value'], ascending=[True, True, False])
# 给每个组内的行分配序号(0是第一名,1是第二名)
z_sorted['rank'] = z_sorted.groupby(['year', 'type']).cumcount()
# 只保留每组前2名
z_top2 = z_sorted[z_sorted['rank'] < 2]

第三步:生成完整的分组+排名组合

为了处理分组不足2条的情况(比如1997年type y只有1条数据),我们需要生成所有year、type和rank(0、1)的组合,确保每个分组都有2个位置:

# 获取所有唯一的年份和类型
unique_years = z['year'].unique()
unique_types = z['type'].unique()

# 生成所有(年份、类型、排名)的组合
multi_index = pd.MultiIndex.from_product(
    [unique_years, unique_types, [0, 1]],
    names=['year', 'type', 'rank']
)
full_df = pd.DataFrame(index=multi_index).reset_index()

第四步:合并数据并填充缺失值

把之前筛选出的前2名数据和完整组合表合并,然后把缺失的value和name替换成NULL,再把type映射成你预期的a/b/c:

# 合并数据,保留所有完整组合
result = full_df.merge(z_top2, on=['year', 'type', 'rank'], how='left')
# 填充缺失值为NULL
result[['value', 'name']] = result[['value', 'name']].fillna('NULL')
# 把type映射成a/b/c,匹配你的预期输出格式
type_mapping = {'x': 'a', 'y': 'b', 'z': 'c'}
result['category'] = result['type'].map(type_mapping)
# 调整列顺序,得到最终结果
final_result = result[['year', 'category', 'value', 'name']]

最终输出示例

运行上面的代码后,final_result就会输出你想要的格式,以1997年为例:

yearcategoryvaluename
1997a45ax
1997a78cop
1997b34akl
1997bNULLNULL
1997c121cl
1997c76bab

这样就完美实现了每年各类型下价值最高的前2个name,不足的自动补NULL啦!

内容的提问来源于stack exchange,提问作者Devarshi Goswami

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 15:39:07