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

如何用Pandas groupby获取各城市计数最多的人,字母序破平局

按城市统计出现次数最多的人员(平局取字母序靠前项)

实现步骤:

  1. 统计城市-人员的出现频次
    先通过分组统计,得到每个城市下各人员的出现次数:
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')
  1. 排序并筛选目标结果
    对每个城市内的记录,先按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 14:05:17