Python 3.x 熊猫按两列分组,并按降序排列其中一列的每个值的前n行

Python 3.x 熊猫按两列分组,并按降序排列其中一列的每个值的前n行,python-3.x,pandas,pandas-groupby,greatest-n-per-group,Python 3.x,Pandas,Pandas Groupby,Greatest N Per Group,我有一个包含许多列的熊猫数据框架(两个感兴趣的列名是a和b) 我想按a和b 计算每个组的发生率 按事件的降序对每个组进行排序 对于b的每个值,我想取出现次数最多的a的前n个值 我可以使用以下代码执行步骤3: a_b_count = df.groupby(['a', 'b']).size().reset_index().rename({0:'count'},axis='columns').sort_values('count', ascending = False) 但是,对于b的每个值,如

我有一个包含许多列的熊猫数据框架(两个感兴趣的列名是
a
b

  • 我想按
    a
    b
  • 计算每个组的发生率
  • 按事件的降序对每个组进行排序
  • 对于
    b
    的每个值,我想取出现次数最多的
    a
    的前n个值
  • 我可以使用以下代码执行步骤3:

      a_b_count = df.groupby(['a', 'b']).size().reset_index().rename({0:'count'},axis='columns').sort_values('count', ascending = False)
    
    但是,对于
    b
    的每个值,如何获得
    a
    的前n个值,其中出现次数最多

    示例

    df =
    
         a           b       ...
         a1          b1      ...
         a2          b1      ...
         a1          b1      ...
         a1          b2      ...
         a2          b2      ...
         a2          b2      ...
    
    预期输出(对于
    n=1
    ):

    您可以使用而不是
    排序
    。相对于系列大小,较小的
    n
    会更快




    这里有一种方法,使用获取列
    a
    b
    的频率:

    pd.crosstab(df.a, df.b).stack().nlargest(1, keep="all").reset_index(name="count")
    

    您想要
    计数
    还是
    前N个值
    ?这是两种不同的情况。您的步骤4显示Top N,但您的输出显示count。另外,在您的输出中,a列和b列是向后的吗?我希望在减少计数的基础上得到前n个值。这有意义吗?
    df.groupby(['a', 'b']).size().groupby(
        level=1).nlargest(n).reset_index(-1, drop=True)
    
    b   a 
    b1  a1    2
    b2  a2    2
    dtype: int64
    
    pd.crosstab(df.a, df.b).stack().nlargest(1, keep="all").reset_index(name="count")