首页 > 解决方案 > 当`by`列包含具有相同起始值的值时,使用pd.Series.mode的python数据框gropuby会引发错误

问题描述

我有一个如下的数据框。

df2 = pd.DataFrame({
    "Name" : ['Thomas', 'Thomas', 'Thomas John'],
    "Credit" : [1200, 1300, 900],
    "Mood" : ['sad', 'happy', 'happy']
})

我正在尝试将其分组如下。

aggrFDColumnDetails = {
   'Mood':pd.Series.mode,
   'Credit':'sum'
}
df2.groupby(['Name']).agg(aggrFDColumnDetails)

但它会引发以下错误

Exception: Must produce aggregated value
.....
....
and a lot of stack traces..

如果我将第三个名称更改为John而不是Thomas John,它将按预期工作。谁能帮我解决它?

分析 - 1 如果我按如下方式更改数据框,它可以工作

df2 = pd.DataFrame({
    "Name" : ['Thomas John', 'Thomas John', 'Thomas'],
    "Credit" : [1200, 1300, 900],
    "Mood" : ['sad', 'happy', 'happy']
})

如果该值以前一行的值开头,则会引发错误

标签: pandasdataframepython-3.6pandas-groupbymode

解决方案


我们可以使用:

aggrFDColumnDetails = {
   'Mood':lambda x: x.value_counts().idxmax(),
   'Credit':'sum'
}
df=df2.groupby(['Name']).agg(aggrFDColumnDetails)
print(df)

              Mood  Credit
Name                      
Thomas       happy    2500
Thomas John  happy     900

作为Series.value_counts降序排序,我们还可以使用:

aggrFDColumnDetails = {
   'Mood':lambda x: x.value_counts().index[0],
   'Credit':'sum'
}

推荐阅读