2016-10-28 2 views
2

Я борюсь с фреймворком данных, в котором перечислены большие объемы данных, которые имеют несколько уровней фильтрации, если это имеет смысл. Таким образом, мои данные теперь отсортированы по имени штата в алфавитном порядке. Второй уровень фильтрации применяется к совокупным данным для каждого округа. Используемая фильтрация была df.sort_values(). Теперь мне нужно извлечь самые высокие три подсчета графства в штате, и я не понимаю, как это сделать.Возвращение nlargest для вложенного отсортированного фрейма данных с использованием Pandas

Так мои данные выглядит примерно так (я опустил индекс строки здесь):

State County Population 
Alabama a   100 
Alabama b   50 
Alabama c   40 
Alabama d   5 
Alabama e   1 
... 
Wyoming a.51  180 
Wyoming b.51  150 
Wyoming c.51  56 
Wyoming d.51  5 

Теперь то, что я хочу от dataframe, чтобы получить самый высокий заселенных округов за состояние. Не работая с пандами, я предпочел бы сделать это. Что-то вроде этого (очевидно erronous):

list_l = [] 
for i in df['State'].unique(): #Get a series with every unique state listed once 
    list_l.append(df[(df['State'] == i])).nlargest(3) 
return list_l 

Даже когда печатаю это я знаю, это не в полной мере имеет смысл, но я не знаю, как объяснить это лучше. Надеюсь, кто-то может помочь.

Приветствия

+0

К сожалению вы после 'df.groupby ('State') [ 'населения'] nlargest (. 3) '? – EdChum

+0

Вы используете индекс из приведенного выше фрагмента кода для индексации в основной файл df: 'df.loc [df.groupby ('State') ['Population']. Nlargest (3) .index.get_level_values ​​(1)]' – EdChum

+0

Привет, да, это то, что мне нужно. Я все еще склоняюсь к мысли о том, как думать о пандах. – gaatjeniksaan

ответ

4

Я думаю, что вам нужно groupby с nlargest:

s = df.groupby('State')['Population'].nlargest(3) 
print (s) 
State  
Alabama 0 100 
     1  50 
     2  40 
Wyoming 5 180 
     6 150 
     7  56 
Name: Population, dtype: int64 

Тогда get_level_values от второго уровня и выбрать по ix:

print (s.index.get_level_values(1)) 
Int64Index([0, 1, 2, 5, 6, 7], dtype='int64') 

print (df.ix[s.index.get_level_values(1)]) 
    State County Population 
0 Alabama  a   100 
1 Alabama  b   50 
2 Alabama  c   40 
5 Wyoming a.51   180 
6 Wyoming b.51   150 
7 Wyoming c.51   56 
+0

Спасибо! Кажется, это так просто, но я боролся с этим в течение нескольких часов ... Мне нравится это сообщество! – gaatjeniksaan

0

Вы можете использовать

df.sort_values('State', 'Population')

После этого, вы можете использовать

df.groupby('State').head(3)

Короче:

s = df.sort_values(['State','Population'],ascending=False).groupby('State').head(3) 
+0

Да, я использовал это, но он только сортирует мой Dataframe. Мне нужно извлечь самые высокие три популяции на каждое государство. Я реализовал решение Jezraels и работает как шарм. – gaatjeniksaan

+0

.head (3) извлечет его. – paulmassimo

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