如何使用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年为例:
| year | category | value | name |
|---|---|---|---|
| 1997 | a | 45 | ax |
| 1997 | a | 78 | cop |
| 1997 | b | 34 | akl |
| 1997 | b | NULL | NULL |
| 1997 | c | 121 | cl |
| 1997 | c | 76 | bab |
这样就完美实现了每年各类型下价值最高的前2个name,不足的自动补NULL啦!
内容的提问来源于stack exchange,提问作者Devarshi Goswami
相关产品推荐
相关产品推荐

