首页 > 解决方案 > 如何以聚合函数为计数获取由多列分组的第一行数据框?

问题描述

我有一个数据框,我只想要每个组的第一行(使用多列分组),聚合函数作为计数。这是我尝试过的:

>>> 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

我怎样才能得到这第一行?

标签: pythonpandasdataframeaggregatepandas-groupby

解决方案


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

推荐阅读