2017-02-16 6 views
0

У меня есть список, который выглядит следующим образом:Как сохранить верхние 3 строки каждой группы в кадре данных pandas?

var1  var2 count 
A  abc  4 
A  abc  3 
A  abc  2 
A  abc  1 
A  abc  1 
B  abc  7 
B  abc  5 
B  abc  2 
B  abc  1 
B  abc  1 
C  abc  4 
C  abc  3 
C  abc  2 
C  abc  1 
C  abc  1 

.... 

Я хочу, чтобы создать новый dataframe с топ-3 «количество» результатов от каждой группы. Это должно выглядеть так:

 var1  var2 count 
     A  abc  4 
     A  abc  3 
     A  abc  2 
     B  abc  7 
     B  abc  5 
     B  abc  2 
     C  abc  4 
     C  abc  3 
     C  abc  2 
     .... 

Есть ли удобный способ сделать это в Python с помощью head()?

ответ

4

Решение с set_index, groupby и SeriesGroupBy.nlargest:

df = df.set_index('var2').groupby("var1")['count'].nlargest(3).reset_index() 
print (df) 
    var1 var2 count 
0 A abc  4 
1 A abc  3 
2 A abc  2 
3 B abc  7 
4 B abc  5 
5 B abc  2 
6 C abc  4 
7 C abc  3 
8 C abc  2 
2

Если граф столбец отсортирован в порядке убывания, то вы можете просто использовать groupby.head взять первые три строки из каждой группы:

df.groupby("var1").head(3) 

enter image description here

В противном случае, вы можете сгруппировать кадра данных на var1 и использовать nlargest для извлечения трех рядов с верхними 3 значениями:

df.groupby("var1", group_keys=False).apply(lambda g: g.nlargest(3, "count")) 

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^