如何按Name列出现频次从高到低排序DataFrame并保留原结构
解决方案
要实现按Name出现频次从高到低排序、同Name记录聚合且保留原列结构的需求,你可以通过以下两种简洁方法实现:
方法一:临时计数列辅助排序
先为每条记录添加对应Name的出现次数,再基于该次数排序后移除临时列:
# 统计每个Name的出现次数 name_freq = df['Name'].value_counts() # 为原DataFrame添加频次列 df['freq'] = df['Name'].map(name_freq) # 按频次降序排序,同频次的Name保持原组内顺序 df = df.sort_values(by='freq', ascending=False) # 移除临时频次列并重置索引(可选,按需保留原索引可省略reset_index) df = df.drop(columns='freq').reset_index(drop=True)
方法二:利用sort_values的key参数(更简洁)
直接通过key参数映射Name的频次,无需创建临时列:
df = df.sort_values( by='Name', key=lambda col: col.map(col.value_counts()), ascending=False ).reset_index(drop=True)
结果说明
两种方法都会得到你需要的输出结构:
Name Age 0 Mukul 22 1 Mukul 21 2 Rohan 22 3 Rohan 24 4 Robin 20 5 Manoj 20 6 Kamal 21
其中同Name的记录会聚合在一起,且按出现频次从高到低排列,组内记录保留原DataFrame中的顺序。
你之前的代码使用groupby做了聚合统计,所以得到的是频次汇总表而非原结构的排序结果,上述方法则是对原数据行进行排序,完全符合需求。
内容的提问来源于stack exchange,提问作者Ritesh Mukhopadhyay
相关产品推荐
相关产品推荐

