Найдите самую раннюю запись в каждой группе по месяцам - PullRequest
0 голосов
/ 31 января 2019

У меня есть такой фрейм данных для панд:

Month  Name  Revenue   EARLY_MIN
Jan     A     100        ?
Jan     A      50        ?
Feb     A      30        ?

Для каждого «Имени» я хочу выбрать самую раннюю запись (январь).Если он возвращает более одной строки, я выберу запись с мин.Доход.Так что 50 в этом случае.И я создам столбец EARLY_MIN = 1 для этой записи.Так что в этом примере вторая строка с EARLY_MIN = 1, другие строки будут иметь EARLY_MIN = 0.

Как я могу сделать это в пандах с мин.количество шагов?

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Используя ту же настройку с Vaishali

#df['Month'] = pd.to_datetime(df.Month, format='%b').dt.month

df['EARLY_MIN']=(~df.sort_values(['Month','Revenue']).duplicated('Name',keep='first')).astype(int)
df
Out[1006]: 
   Month Name  Revenue  EARLY_MIN
0      1    A      100          0
1      1    A       50          1
2      2    A       30          0
0 голосов
/ 31 января 2019

Используя python calendar stdlib, вы можете конвертировать "Месяцы" в числовое значение.Это позволяет нам упорядочивать строки на основе значения «Месяц».

import calendar

mapping = {calendar.month_abbr[k]: k for k in range(1, 13)}
u = df.assign(Month=df.Month.map(mapping))
u

   Month Name  Revenue EARLY_MIN
0      1    A      100         ?
1      1    A       50         ?
2      2    A       30         ?

Теперь вы можете использовать groupby и idxmin или что-то подобное.

idx = (u['Revenue'].mask(u.groupby('Name').Month.transform('min') != u['Month'])
                   .groupby(u.Name)
                   .idxmin()
                   .values)
df.loc[idx, 'EARLY_MIN'] = 1
df

  Month Name  Revenue EARLY_MIN
0   Jan    A      100         ?
1   Jan    A       50         1
2   Feb    A       30         ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...