如何在Pandas DataFrame中按团队和角色统计出现最多的国家
问题描述
现有如下Pandas DataFrame df:
Team Name Role Country Mobile Developer USA Mobile Developer USA Mobile Developer USA Mobile Developer USA Mobile Product Owner USA Mobile Product Owner USA Mobile Product Owner UK Mobile Scrum Master India Mobile Scrum Master India Mobile Developer UK Mobile Developer UK Mobile Developer UK Web Developer UK Web Developer UK Web Developer UK Web Developer UK Web Product Owner India Web Product Owner India Web Product Owner UK Web Scrum Master USA Web Scrum Master USA Web Developer USA Web Developer USA Web Developer USA
需要按团队(Mobile/Web)和角色(Role),统计每个团队-角色组合下出现次数最多的Country值;若出现次数并列,随机取第一个值。最终结果支持以下两种格式:
结果格式1(宽表):
Team Name Developer Product Owner Scrum Master Mobile USA USA India Web UK India USA
结果格式2(长表):
Team Name Role Country (Most occuring value) Mobile Developer USA Mobile Product Owner USA Mobile Scrum Master India Web Developer UK Web Product Owner India Web Scrum Master USA
解决方案
实现结果格式2(长表)
通过分组后提取众数实现:
import pandas as pd # 按团队和角色分组,取Country的众数(并列时取第一个) result_long = df.groupby(['Team Name', 'Role'])['Country'].agg(lambda x: x.mode().iloc[0]).reset_index() # 重命名列名匹配需求 result_long.columns = ['Team Name', 'Role', 'Country (Most occuring value)'] print(result_long)
核心逻辑:groupby按团队+角色分组,mode()获取众数,iloc[0]确保并列时取第一个结果,reset_index()将分组索引转为普通列。
实现结果格式1(宽表)
基于长表结果,用pivot转换为宽表:
# 先获取长表结果 result_long = df.groupby(['Team Name', 'Role'])['Country'].agg(lambda x: x.mode().iloc[0]).reset_index() # 转换为宽表结构 result_wide = result_long.pivot(index='Team Name', columns='Role', values='Country').reset_index() # 移除列索引名称,匹配格式要求 result_wide.columns.name = None print(result_wide)
核心逻辑:pivot将Role的不同取值转为列,index='Team Name'作为行标识,最后清除列索引名称使输出符合要求。
并列场景的替代处理
如果需要更明确的“取次数排序后的第一个值”,可以将聚合函数替换为:
lambda x: x.value_counts().index[0]
value_counts()会按出现次数降序排列,取第一个索引值,效果与mode()一致,同样满足并列时取第一个值的需求。
内容的提问来源于stack exchange,提问作者Leo82
相关产品推荐
相关产品推荐

