Как получить первый ряд данных, сгруппированных по нескольким столбцам с агрегатной функцией в качестве количества? - PullRequest
1 голос
/ 26 октября 2019

У меня есть фрейм данных, в котором я хочу только первую строку каждой группы (сгруппированные по нескольким столбцам) с агрегатной функцией в качестве счетчика. Вот что я пробовал:

>>> 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 Ответ

3 голосов
/ 26 октября 2019

Используйте 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
...