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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:17:43