Pandas:不执行聚合操作的分组与排序实现问题
Pandas:不执行聚合操作的分组与排序实现问题
嗨,我完全懂你的需求——你只是想把同城市的行归到一块儿,同时按「运动场地数量」排序,而且不需要做任何聚合计算(比如求和、计数这类),确实用groupby加聚合函数的常规思路不太对路,给你两个简单的实现方案:
方案一:先排序,自动实现“分组”效果
其实最直接的方式是先对数据排序,因为当你按「运动场地数量」和「城市」排序后,同一个城市的行自然会挨在一起,而且整体会按照场地数量的大小排列,完全符合你的要求:
# 先处理城市名称的小瑕疵(比如把NYC.改成NYC,避免被当成不同城市) df['City'] = df['City'].str.strip('.') # 只选择需要的两列,然后按场地数量、城市排序(ascending=False可以改成从大到小) result = df[['City', 'No. of Sport Fields']].sort_values(by=['No. of Sport Fields', 'City']) print(result)
运行后你会看到,所有同城市的行都聚在一起,而且整个结果是按运动场地数量排序好的,完美满足“分组+排序”的需求,还不用写复杂的分组逻辑。
方案二:用groupby遍历分组(适合需要单独处理每组的场景)
如果你就是想明确用分组的方式实现,也完全可以——groupby不一定非要配合聚合函数,我们可以先排序,再分组遍历每个城市的数据:
# 先清洗城市名称 df['City'] = df['City'].str.strip('.') # 先按运动场地数量排好序,确保分组后的顺序是按场地数来的 df_sorted = df.sort_values(by='No. of Sport Fields') # 按城市分组,注意设置sort=False,这样会保持我们之前排序的组顺序 for city, group in df_sorted.groupby('City', sort=False): print(f"--- {city} ---") print(group[['City', 'No. of Sport Fields']])
这个方法会把每个城市的结果单独打印出来,还带个城市标题,如果你需要对每个城市的行做额外处理的话,这个方式会更灵活。
小提醒
你数据里的NYC.(带点)和NYC会被Pandas当成两个不同的城市,所以一定要先做个简单的清洗,不然分组结果会出错哦。
备注:内容来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

