使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数

Posted

技术标签:

【中文标题】使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数【英文标题】:Using pandas to perform groupby on a dataframe, sort by the count and get the top 2 counts in python 【发布时间】:2020-01-02 21:47:16 【问题描述】:

我正在处理数据框并希望按列 (ID) 进行分组,显示各自的标签并计算每个标签。然后如何使用 python 获取数据框中每个 ID 的前 2 个标签?

data= 
ID  Label
A   Apple
B   Apple
B   Apple
C   Banana
C   Pear
A   Pear
B   Apple
C   Apple
A   Banana
A   Apple
C   Pear
A   Banana
B   Pear
B   Pear
B   Banana
C   Apple

我已经能够按 ID 和标签进行分组,还可以得到每个 ID 的计数,但我无法得到每个 ID 的前 2 个的最后一部分。

data.groupby(['ID','Label']).size().reset_index(name='counts')

这给了我这张桌子:

ID  Label   counts
A   Apple   2
A   Banana  2
A   Pear    1
B   Apple   3
B   Banana  1
B   Pear    2
C   Apple   2
C   Banana  1
C   Pear    2

我想要的预期结果是:

ID  Label   counts
A   Apple   2
    Banana  2
B   Apple   3
    Pear    2
C   Apple   2
    Pear    2

【问题讨论】:

【参考方案1】:

如果你只需要head两个(Top 2)

data.groupby(['ID']).Label.value_counts().groupby(level=0).head(2)
Out[770]: 
ID  Label 
A   Apple     2
    Banana    2
B   Apple     3
    Pear      2
C   Apple     2
    Pear      2
Name: Label, dtype: int64

【讨论】:

【参考方案2】:

使用返回排序值的SeriesGroupBy.value_counts,所以添加了GroupBy.head

df = (data.groupby('ID')['Label']
          .value_counts()
          .groupby(level=0)
          .head(2)
          .reset_index(name='counts'))
print (df)
  ID   Label  counts
0  A   Apple       2
1  A  Banana       2
2  B   Apple       3
3  B    Pear       2
4  C   Apple       2
5  C    Pear       2

或者使用自定义 lambda 函数:

df = (data.groupby('ID')['Label']
          .apply(lambda x: x.value_counts().head(2))
          .reset_index(name='counts'))

【讨论】:

感谢您的回复。如果我想要通过排序而不是使用计数大于 2 的行来获得实际的前 2 名,我会使用什么。【参考方案3】:

pd.concat

pd.concat(k: d.Label.value_counts().head(2) for k, d in data.groupby('ID'))

A  Apple     2
   Banana    2
B  Apple     3
   Pear      2
C  Apple     2
   Pear      2
Name: Label, dtype: int64

塞住并系好

pd.concat(
    k: d.Label.value_counts().head(2) for k, d in data.groupby('ID'),
    names=['ID', 'Label']
).reset_index(name='counts')

  ID   Label  counts
0  A   Apple       2
1  A  Banana       2
2  B   Apple       3
3  B    Pear       2
4  C   Apple       2
5  C    Pear       2

【讨论】:

以上是关于使用 pandas 在数据帧上执行 groupby,按计数排序并获取 python 中的前 2 个计数的主要内容,如果未能解决你的问题,请参考以下文章

在 pandas 数据帧上同时操作 groupby 和 resample?

Groupby 在一列 pandas 数据帧上,并使用 GridsearchCv 使用通用 sklearn 管道训练每个组的特征和目标 (X, y)

spark - 在大型数据帧上执行 groupby 和聚合时,java 堆内存不足

如何在包含 numpy.ndarrays 的列/列的 pandas 数据帧上执行 StandardScaler?

数据帧上的 spark GROUPED_MAP udf 是不是并行运行?

Python/Pandas - 结合 groupby 平均值和最小值