python - 根据时间条件获取每个组的最大值
问题描述
我有这个数据框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时,我才需要获得最大值。即 forid=1
和date=2021-07-08
max
columns 应该等于 8,而不是 10,因为我们在time
9: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
解决方案
让我们分步进行
- 从时间列中提取小时部分
- 将小时组件与
7
创建布尔掩码进行比较 - 屏蔽
record
小时大于的列中的值7
Group
被屏蔽的列 byid
和usingdate
来计算每组的最大值transform
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
推荐阅读
- couchdb - Couchdb 以集群模式监视更改提要,返回相同自值的随机更改
- python - 不准确的 scipy 最小化有界
- javascript - 从表的字段中返回一个值
- html - 单击按钮到新页面时自动对焦(单独的html)
- c# - 在itexsharp中将单元格中心的文本与图像旁边的文本对齐
- python - 未找到模块错误:没有名为“src”的模块
- spring - Spring boot @Inject 代理解析为 null
- php - PHP以交替顺序合并数组的最佳解决方案
- java - 导致 assertEquals 的整数上预期/实际值的微小差异失败
- java - 如何从 BLE 设备接收数据?