按月查找每个组中最早的记录

时间:2019-01-31 18:11:11

标签: python pandas group-by pandas-groupby

我有一个这样的熊猫数据框:

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

对于每个“名称”,我想选择最早的记录(1月)。如果返回多行,我将选择带有min的记录。收入。因此,在这种情况下为50。我将为此记录创建一列EARLY_MIN = 1。因此,在此示例中,第二行的EARLY_MIN = 1,其他行的EARLY_MIN = 0。

我怎么能在熊猫中做到这一点?多少步?

2 个答案:

答案 0 :(得分:4)

使用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         ?

现在,可以使用groupbyidxmin,或类似的东西。

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         ?

答案 1 :(得分:4)

通过与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