Pandas:对于groupby value_counts,返回最大计数的行

5

我希望做的事情跟这个问题几乎一样。

然而,@jezrael在被接受的答案中的方法基于我的数据集花费时间太长 —— 原始数据框中有约300k行数据,并且运行nlargest(1)命令需要几分钟时间。此外,我已经在一个限制了head(1000)的数据框上尝试过,但没有得到每个value_count内只有1行的结果 —— 我得到的是完全相同的系列作为value_counts。

用我自己的话来说:基本上,我的数据集有两列,就像这样:

Session Rating
A       Positive
A       Positive
A       Positive
A       Negative
B       Negative
B       Negative
C       Positive
C       Negative

使用 counts = df.groupby('Session')['Rating'].value_counts(),我得到了一个如下所示的 Series 对象:

Session Rating
A       Positive  3
        Negative  1
B       Negative  2
C       Positive  1
        Negative  1

如何获得一个数据框(dataframe),其中只包含评分(Rating)最大值的那一行?当存在多个最大值时(例如C),我希望从返回的表格中排除它。


请查看以下链接以获得更快的方法(在这里使用numpy比pandas更好):https://dev59.com/MlwY5IYBdhLWcg3w0Kgs#32192310 - n1tk
@0709 我尝试了接受的答案,使用了他生成的相同数据集,但是结果并不相同——由于某种原因,形状等于k。 - manestay
1个回答

7
我认为您想要的是这样的内容。
df.groupby('Session')['Rating'].apply(lambda x: x.value_counts().head(1))

输出:

Session          
A        Positive    3
B        Negative    2
C        Negative    1
Name: Rating, dtype: int64

有没有其他方法可以不使用apply呢?我面临着相同的问题,需要处理100万行数据... - Xavier Bourret Sicotte
2
尝试这个:df.groupby('Session')['Rating'].value_counts().groupby(level=0).head(1) @XavierBourretSicotte - Scott Boston
@ScottBoston, 你能否解释一下 level=0 和 head(1) 是什么意思? - Reihan_amn
1
@Reihan_amn Groupby level=0 是按照数据框的索引级别为0进行分组,如果是多级索引,则按照第一级别进行分组;如果不是,则只按照索引进行分组。head(1) 用于获取每个组的第一条记录。因此,在每个组中仅获取第一条记录。 - Scott Boston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接