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



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

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

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

如何在步数最少的熊猫中做到这一点?

使用 python 的 calendar stdlib,您可以将"Months"转换为数值。这使我们能够轻松地根据"Month"值对行进行排序。

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         ?

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

最新更新