首页 > 解决方案 > 根据时间条件获取每个组的最大值

问题描述

我有这个数据框df

   id        date     time  record
0   1  2021-07-08  3:00:00       8
1   1  2021-07-08  5:30:00       7
2   1  2021-07-08  9:00:00      10
3   1  2021-01-08  6:30:00       5
4   1  2021-01-08  9:30:00       7
5   2  2021-07-08  3:00:00       7
6   2  2021-07-08  9:00:00      14
7   2  2021-07-08  5:30:00      10
8   2  2021-01-08  3:00:00      11
9   2  2021-01-08  3:00:00      13

我需要创建一个新列,该列max等于由id和分组的最大值datetime但也只有当早于 7:00:00时,我才需要获得最大值。即 forid=1date=2021-07-08 maxcolumns 应该等于 8,而不是 10,因为我们在time9:00:00 时得到了 10。

df是更易于访问的数据框

import io
import pandas as pd

data1_txt = """
id,date,time,record
1,2021-07-08,3:00:00,8
1,2021-07-08,5:30:00,7
1,2021-07-08,9:00:00,10
1,2021-01-08,6:30:00,5
1,2021-01-08,9:30:00,7
2,2021-07-08,3:00:00,7
2,2021-07-08,9:00:00,14
2,2021-07-08,5:30:00,10
2,2021-01-08,3:00:00,11
2,2021-01-08,3:00:00,13
"""

df = pd.read_csv(io.StringIO(data1_txt))

理想的结果是

   id        date     time  record  max
0   1  2021-07-08  3:00:00       8    8
1   1  2021-07-08  5:30:00       7    8
2   1  2021-07-08  9:00:00      10    8
3   1  2021-01-08  6:30:00       5    5
4   1  2021-01-08  9:30:00       7    5
5   2  2021-07-08  3:00:00       7   10
6   2  2021-07-08  9:00:00      14   10
7   2  2021-07-08  5:30:00      10   10
8   2  2021-01-08  3:00:00      11   13
9   2  2021-01-08  3:00:00      13   13

标签: pythonpandasdataframedatetime

解决方案


让我们分步进行

  • 从时间列中提取小时部分
  • 将小时组件与7创建布尔掩码进行比较
  • 屏蔽record小时大于的列中的值7
  • Group被屏蔽的列 byid和usingdate来计算每组的最大值transformmax
m = pd.to_timedelta(df['time']).dt.components['hours'].ge(7)
df['max'] = df['record'].mask(m).groupby([df['id'], df['date']]).transform('max')

   id        date     time  record   max
0   1  2021-07-08  3:00:00       8   8.0
1   1  2021-07-08  5:30:00       7   8.0
2   1  2021-07-08  9:00:00      10   8.0
3   1  2021-01-08  6:30:00       5   5.0
4   1  2021-01-08  9:30:00       7   5.0
5   2  2021-07-08  3:00:00       7  10.0
6   2  2021-07-08  9:00:00      14  10.0
7   2  2021-07-08  5:30:00      10  10.0
8   2  2021-01-08  3:00:00      11  13.0
9   2  2021-01-08  3:00:00      13  13.0

推荐阅读