代码之家  ›  专栏  ›  技术社区  ›  Himanshu Poddar

如何将第一行数据帧按多个列分组,聚合函数为count?

  •  1
  • Himanshu Poddar  · 技术社区  · 5 年前

    我有一个dataframe,我只想要每个组的第一行(使用多个列分组),其中aggregate函数作为count。这就是我尝试过的:

    >>> df = pd.DataFrame([[1.1, 1.1, 1.1, 2.6, 2.5, 3.4,2.6,2.6,3.4,3.4,2.6,1.1,1.1,3.3], list('AAABBBBABCBDDD'), [1.1, 1.7, 2.5, 2.6, 3.3, 3.8,4.0,4.2,4.3,4.5,4.6,4.7,4.7,4.8], ['x/y/z','x/y','x/y/z/n','x/u','x','x/u/v','x/y/z','x','x/u/v/b','-','x/y','x/y/z','x','x/u/v/w'],['1','3','3','2','4','2','5','3','6','3','5','1','1','1']]).T
    >>> df.columns = ['col1','col2','col3','col4','col5']
    >>> df[['col1', 'col2', 'col4']].groupby(['col2', 'col4']).agg('count')
                  col1
    col2 col4
    A    x           1
         x/y         1
         x/y/z       1
         x/y/z/n     1
    B    x           1
         x/u         1
         x/u/v       1
         x/u/v/b     1
         x/y         1
         x/y/z       1
    C    -           1
    D    x           1
         x/u/v/w     1
         x/y/z       1
    

    预期产量:

     col2 col4         col1
        A    x           1
        B    x           1
        C    -           1
        D    x           1
    

    我怎样才能坐到第一排?

    1 回复  |  直到 5 年前
        1
  •  1
  •   jezrael    5 年前

    使用 GroupBy.head 按索引的第一级:

    df2 = df1.groupby(level='col2').head(1)
    #used first level
    #df2 = df1.groupby(level=0).head(1)
    print (df2)
               col1
    col2 col4      
    A    x        1
    B    x        1
    C    -        1
    D    x        1
    

    或使用 boolean indexing 通过提取一级值 Index.duplicated 倒装面具 ~ 以下内容:

    df2 = df1[~df1.index.get_level_values('col2').duplicated()]
    
    #used first level
    #df2 = df1[~df1.index.get_level_values(0).duplicated()]
    print (df2)
               col1
    col2 col4      
    A    x        1
    B    x        1
    C    -        1
    D    x        1