2016-06-03 3 views
1

У меня есть DataFrame, который выглядит следующим образом:панды nlargest возвращается больше, чем п строк

  name  value 
date 
2016-05-01 kelly  20 
2016-05-05 john  12 
2016-05-05 sarah  25 
2016-05-05 george  3 
2016-05-05 tom  40 
2016-05-07 kara  24 
2016-05-07 jane  90 
2016-05-07 sally  39 
2016-05-07 sam  28 

Я хочу, чтобы получить верхние 3 строки (по значению), предпочтительно в день. Я ожидал что-то вроде этого:

  name  value 
date 
2016-05-01 kelly  20 
2016-05-05 john  12 
2016-05-05 sarah  25 
2016-05-05 tom  40 
2016-05-07 jane  90 
2016-05-07 sally  39 
2016-05-07 sam  28 

, но я в порядке и с этим:

  name  value 
date 
2016-05-05 tom  40 
2016-05-07 jane  90 
2016-05-07 sally  39 

Я попытался df.nlargest(3, 'value'), но я получаю этот странный результат:

  name  value 
date  
2016-05-01 kelly  20 
2016-05-01 kelly  20 
2016-05-01 kelly  20 
2016-05-05 tom  40 
2016-05-05 tom  40 
2016-05-05 tom  40 
2016-05-05 sarah  25 
2016-05-05 sarah  25 
2016-05-05 sarah  25 
2016-05-07 kara  24 
2016-05-07 kara  24 
... 
2016-05-07 sally  39 
2016-05-07 sally  39 
2016-05-07 jane  90 
2016-05-07 jane  90 
2016-05-07 jane  90 

I пытался использовать его изо дня в день:
[df.ix[day].nlargest(3, 'value') for day in df.index.unique()]

но у меня такая же проблема (каждое имя дублируется 3 раза)

ответ

2

Для начала, это будет получить работу:

df.sort_values('value', ascending=False).groupby(level=0).head(3).sort_index() 
+0

Спасибо! поэтому groupby (level = 0) + sorting получил результаты за дату так же, как мне было нужно. Я предполагаю, что самый крупный не может использоваться в этом случае использования – codekitty

0

Использование [:n] ломтик sort_values() результат

Использование sort_values() в descending mode и возьмите first n results in a slice, затем используйте sort_index(), чтобы сохранить дни monotonically increasing.

import pandas as pd 
import cStringIO 

df = pd.read_table(cStringIO.StringIO(''' 
date name  value 
2016-05-01 kelly  20 
2016-05-05 john  12 
2016-05-05 sarah  25 
2016-05-05 george  3 
2016-05-05 tom  40 
2016-05-07 kara  24 
2016-05-07 jane  90 
2016-05-07 sally  39 
2016-05-07 sam  28 
'''), sep=' *', index_col=0, engine='python') 

print 'Original DataFrame:' 
print df 
print 

df_top3 = df.sort_values('value', ascending=False)[:3].sort_index() 
print 'Top 3 Largest value DataFrame:' 
print df_top3 
print 

Original DataFrame: 
       name value 
date      
2016-05-01 kelly  20 
2016-05-05 john  12 
2016-05-05 sarah  25 
2016-05-05 george  3 
2016-05-05  tom  40 
2016-05-07 kara  24 
2016-05-07 jane  90 
2016-05-07 sally  39 
2016-05-07  sam  28 

Top 3 Largest value DataFrame: 
      name value 
date      
2016-05-05 tom  40 
2016-05-07 jane  90 
2016-05-07 sally  39 
Смежные вопросы