根据时间条件获取每个组的最大值

lskq00tm  于 2021-08-25  发布在  Java
关注(0)|答案(2)|浏览(381)

我有这个数据框 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` 及 `date` . 但我也需要得到最大值,只有当 `time` 早于7:00:00,即 `id=1` 及
date=2021-07-08 `max` 列应该等于8,而不是10,因为当 `time` 是9点。
这是 Dataframe  `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

lbsnaicq

lbsnaicq1#

让我们循序渐进
从时间列中提取小时组件
将小时数组件与 7 创建布尔掩码的步骤
屏蔽中的值 record 小时大于小时的列
7 Group 蒙面柱 iddatetransform 使用 max 计算每组的最大值

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
jtjikinw

jtjikinw2#

让我们确保时间是datatime类型:

df['time'] = pd.to_datetime(df['time'])

过滤时间在7:00之前,分组并应用变换:

s = df.loc[(df['time'] < '7:00')].groupby(['id', 'date'])['record'].transform('max').rename('max')

合并结果并向前填充:

df2 = pd.concat([df, s], axis=1)
df2['max'] = df2['max'].ffill().astype(int)

输出:

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

相关问题