如何识别Pandas Dataframe 中特定列中的“最常出现的文本值”

osh3o9ms  于 2023-02-27  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个Pandas数据框,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           UKtype here

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

我想使用Pandas或任何合适的替代品转换它。对于给定的团队(移动的/Web),我想通过团队成员“角色”导出“最常出现的国家”值。结果数据框架可以是任何形状-选项1或选项2。
我知道会有这样的情况,当有一个平局在'最发生的国家,我会把它作为一个边缘情况下,现在,我会选择任何随机第一值(50%美国,50英国)的情况下平局。
结果数据框选项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

我试过对 Dataframe 进行分组,但是没有给予理想的结果。

sr4lhrrt

sr4lhrrt1#

获取出现次数最多的值的简单方法是在groupby或透视表中使用pd.Series.模式:

df.groupby(["Team Name", "Role"])["Country"].agg(pd.Series.mode).unstack()
# or
df.pivot_table(index="Team Name", columns="Role", values="Country", aggfunc={'Country': pd.Series.mode})

#Role      Developer Product Owner Scrum Master
#Team Name                                     
#Mobile          USA           USA        India
#Web              UK         India          USA

如果有多个最频繁出现的国家/地区,要选择随机国家/地区,可以对groupby应用函数:

def func(x):
    val_counts = x.value_counts().sort_values(ascending=False)
    if sum(val_counts == val_counts.max()) > 1:
        return val_counts[val_counts == val_counts.max()].sample(1).index[0]
    else:
        return val_counts.index[0]
df.groupby(["Team Name", "Role"])["Country"].apply(func).unstack()
# or
df.pivot_table(index="Team Name", columns="Role", values="Country", aggfunc={"Country": func})

#Role      Developer Product Owner Scrum Master
#Team Name                                     
#Mobile          USA           USA        India
#Web              UK         India          USA

测试速度,使用pivot_tablegroupby慢,在函数中使用条件if语句比随机抽取最频繁出现的国家(即使只有1个国家)要快(如您在上面提供的数据)。
要返回输出选项2,请不要在groupby代码末尾使用.unstack()(或将.stack()添加到pivot_table,这将降低比较性能)。

相关问题