pandas mode返回Exception:必须产生聚合价值

uubf1zoe  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(103)

用于此 Dataframe

values  ii
0     3.0   4
1     0.0   1
2     3.0   8
3     2.0   5
4     2.0   1
5     3.0   5
6     2.0   4
7     1.0   8
8     0.0   5
9     1.0   1

此行返回“必须生成聚合值

bii2=df.groupby(['ii'])['values'].agg(pd.Series.mode)

只要这条线还能用

bii3=df.groupby('ii')['values'].agg(lambda x: pd.Series.mode(x)[0])

你能解释一下为什么吗?

busg9geu

busg9geu1#

问题是mode有时会返回2个或更多值,请使用GroupBy.apply检查解决方案:

bii2=df.groupby(['ii'])['values'].apply(pd.Series.mode)
print (bii2)
ii   
1   0    0.0
    1    1.0
    2    2.0
4   0    2.0
    1    3.0
5   0    0.0
    1    2.0
    2    3.0
8   0    1.0
    1    3.0
Name: values, dtype: float64

而pandas agg的输出需要标量,所以返回错误。所以如果选择第一个值,它工作得很好

bii3=df.groupby('ii')['values'].agg(lambda x: pd.Series.mode(x).iat[0])
print (bii3)
ii
1    0.0
4    2.0
5    0.0
8    1.0
Name: values, dtype: float64
bqf10yzr

bqf10yzr2#

正如@jezrael所指出的,mode有时会返回多个值。所以你可以尝试这样做:

bii3=df.groupby('ii')['values'].agg(lambda x: pd.Series.mode(x).to_list())

对于.to_list()部分,对于ii的每个值,你都会得到一个列表,而不仅仅是一个值。你应该得到这样的结果:

ii
1    [0.0, 1.0, 2.0]
4         [2.0, 3.0]
5    [0.0, 2.0, 3.0]
8         [1.0, 3.0]
Name: mode, dtype: object

相关问题