我有一个这样的熊猫数据框:
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。
我怎么能在熊猫中做到这一点?多少步?
答案 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 ?
现在,可以使用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 ?
答案 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