找到每个组每月的最早记录

问题描述 投票:1回答:2

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

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

对于每一个“名称”,我要挑最早记录(一月)。如果返回不止一行,我会选择用最小的纪录。收入。所以50在这种情况下。我会创造这个纪录列EARLY_MIN = 1。因此,在这个例子中,第二行与具有EARLY_MIN = 1,其它行将具有EARLY_MIN = 0。

我怎样才能做到这一点与大熊猫分钟。步数?

python pandas group-by pandas-groupby
2个回答
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         ?

4
投票

通过使用相同的设置了费沙

#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
© www.soinside.com 2019 - 2024. All rights reserved.