如何用Pandas groupby获取各城市计数最多的人,字母序破平局
按城市统计出现次数最多的人员(平局取字母序靠前项)
实现步骤:
- 统计城市-人员的出现频次
先通过分组统计,得到每个城市下各人员的出现次数:
import pandas as pd df = pd.DataFrame({ 'person': ['Mike', 'Mike', 'Mike', 'Bob', 'Bob', 'Bob', 'Susan', 'Cindy', 'Paul', 'Paul', 'Jon', 'Larry', 'Cindy', 'Larry', 'Larry', 'David', 'David', 'David', 'Eric', 'Cindy', 'Paul'], 'city': ['New York', 'New York', 'New York', 'New York', 'New York', 'New York', 'New York', 'London', 'London', 'London', 'London', 'Sydney', 'Sydney', 'Sydney', 'Sydney', 'Sydney', 'Sydney', 'Sydney', 'Tokyo', 'Tokyo', 'Tokyo'] }) # 按城市、人员分组,统计出现次数 counts = df.groupby(['city', 'person']).size().reset_index(name='count')
- 排序并筛选目标结果
对每个城市内的记录,先按count降序(优先取频次高的),再按person升序(频次相同时取字母更靠前的),之后每个城市保留第一条记录:
# 多条件排序:城市升序,频次降序,姓名升序 sorted_counts = counts.sort_values( by=['city', 'count', 'person'], ascending=[True, False, True] ) # 按城市分组取第一条,整理成目标格式 result = sorted_counts.groupby('city').first().reset_index()[['city', 'person']] print(result)
执行后输出结果:
city person 0 London Paul 1 New York Bob 2 Sydney David 3 Tokyo Cindy
补充:用idxmax的实现思路
如果想用idxmax,可以构造复合指标,把频次和字母序结合,确保频次相同的情况下字母靠前的指标值更高,再取每组最大值对应的行:
# 构造复合得分:频次权重放大,减去首字母ASCII值(字母越靠前,得分越高) counts['score'] = counts['count'] * 1000 - counts['person'].str[0].apply(ord) # 按城市分组取score最大的行,整理格式 result = counts.loc[counts.groupby('city')['score'].idxmax()][['city', 'person']].sort_values('city').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

