2016-06-24 7 views
1

Ниже приведен пример большего словаряпанды - падение ряда на основе первого появления состояния

data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams', 
       'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',], 

'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016], 
'month':[11,11,11,11,12,12,12,12,12,1,1], 
'day':[15,16,21,23,1,2,15,18,30,5,7], 
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]} 

Я хочу бросить первое вхождение максимального значения с первого месяца каждого студента. Если есть второе появление, я хочу сохранить это событие

Я использовал groupby by StudentId, год и месяц и рассчитал максимальное значение BookLevel.

Затем я сделал еще dataframe вычислить значение максимального в месяц на одного студента и объединить эти два dataframes

тогда я был dataframe, который выглядит следующим образом:

 StudentId year month BookLevel BookLevelMax 
    0 AAdams 2015 11  1.5   1.5 
    1 AAdams 2015 11  1.5   1.5 
    2 AAdams 2015 11  1.2   1.5 
    3 AAdams 2015 11  1.4   1.5 
    4 AAdams 2015 12  1.7   1.8 
    5 AAdams 2015 12  1.8   1.8 
    6 BBrooks 2015 12  3.2   3.8 
    7 BBrooks 2015 12  3.1   3.8 
    8 BBrooks 2015 12  3.8   3.8 
    9 BBrooks 2016 1  3.3   3.4 
    10 BBrooks 2016 1  3.4   3.4 

Я хочу бросить первый появление 1.5 в месяц 11 для AAdams и 3.8 строки для BBrooks в месяце 12

Я могу использовать df.drop для удаления строк, где BookLevel Max равно BookLevel ... Но он уменьшает максимальное значение в каждом месяце для каждого студент и удаляет как первое, так и второе, если их два.

 StudentId year month BookLevel BookLevelMax 
    2  AAdams  2015 11  1.2  1.5 
    3  AAdams  2015 11  1.4  1.5 
    4  AAdams  2015 12  1.7  1.8 
    6  BBrooks  2015 12  3.2  3.8 
    7  BBrooks  2015 12  3.1  3.8 
    9  BBrooks  2016 1   3.3  3.4 

Я не могу найти способ отказаться только от первого появления и сделать это только в первый месяц. Чтобы быть конкретным, AAdams имеет максимум 1,5 в месяц 11. Это происходит в двух случаях. Я хотел бы сохранить один из строк, но отказаться от другого .... И я хотел бы сохранить строку с 1.8 под AAdams, так как это происходит во второй месяц (и другие случаи в других учениках через несколько месяцев после первого). Надеюсь, это имеет смысл.

ответ

0

Оригинальный вопрос (как указано выше):

Ниже приведен пример большего словаря, который стал dfdata

data ={'StudentId':['AAdams','AAdams','AAdams','AAdams','AAdams','AAdams', 
      'BBrooks','BBrooks','BBrooks','BBrooks','BBrooks',], 

'year':[2015,2015,2015,2015,2015,2015,2015,2015,2015,2016,2016], 
'month':[11,11,11,11,12,12,12,12,12,1,1], 
'day':[15,16,21,23,1,2,15,18,30,5,7], 
'BookLevel':[1.5,1.5,1.2,1.4,1.7,1.8,3.2,3.1,3.8,3.3,3.4]} 

Я хочу бросить первое вхождение от максимального значения с первого месяца каждого студента. Если есть второе вхождение, я хочу сохранить это событие. Я не хочу менять в любой месяц, кроме первого месяца для каждого студента

Это мое новое решение:

df =dfdata.sort_values(by=['StudentId','year','month','BookLevel'],ascending = [True,True,True,False]) 

Это принесло самый высокий BookLevel за первый месяц в верхней части каждой группы StudentID , год месяц.

Тогда я сделал группу с использованием cumcount. Это помещало нуль рядом с каждым из самых высоких уровней книжного уровня для каждого учащегося в течение первого месяца.

df1 = (df.groupby('StudentId').cumcount()) 

Тогда я сделал GroupBy выбирающий все строки без нулевого

df2 = df(df.groupby('StudentId').cumcount() !=0]) 

Миссия выполнена! Оригинальная попытка - отличный пример того, как смотреть на инкрементный прогресс, но теряя из виду исходную цель.

+0

Благодаря Cmari - мне удалось начать, но в дополнение к Jezrael. Сочетание ваших ответов на другие вопросы привело меня к окончательному решению –

0

Попробуйте

# sort and reindex 
df = df.sort('col').reset_index() 

#slice to first occurrence of your value 
df.loc[: df[(df['col'] == 'row')].index[0], :] 
+0

Спасибо, но ....Я получаю следующее примечание к команде slice FutureWarning: элементарное сравнение не удалось; вместо этого возвращающий скаляр, но в будущем будет выполнять элементное сравнение и следующую ошибку. TypeError: недействительное сравнение типов. Также я изменил sort (col) на sort_values ​​(by =) из-за будущей амортизации –

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