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

标签 python pandas group-by pandas-groupby

我有一个像这样的 Pandas 数据框:

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

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

我怎样才能在 pandas 中做到这一点?步数?

最佳答案

使用 python 的 calendar 标准库,您可以将“月”转换为数值。这使我们可以轻松地根据“月份”值对行进行排序。

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         ?

关于python - 按月查找每组中最早的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54466833/

相关文章:

c# - LINQ 方法将集合分组为具有指定元素数量的子组

python - Specifically silent Pandas SettingWithCopyWarning 使用警告上下文管理器?

java - java vs python 中获取十六进制字符串表示的二进制数据

python - 如何获得 groupby 大小的百分比

sql - Postgresql 创建 View

mysql - 获取平均日或周值

python - 如何在十六进制python中制作范围?

Python 线程错误组参数目前必须为 None

python - 扩大 Pandas 日期范围

python - Pandas 在一个图中比较每小时的多年数据