按col1列连续值分组,提取每组col2/col3最早、col4/col5最晚日期时间
需求说明
需要按col1列中的连续相同值进行分组,对每个分组提取:
col2和col3中的最早日期与小时col4和col5中的最晚日期与小时
原始数据
| col1 | col2 | col3 | col4 | col5 | |
|---|---|---|---|---|---|
| 0 | a | 2021-07-03 | 17:08 | 2021-07-04 | 10:41 |
| 1 | b | 2021-07-10 | 04:14 | 2021-07-11 | 04:32 |
| 2 | c | 2021-07-13 | 02:03 | 2021-07-14 | 00:45 |
| 3 | d | 2021-07-14 | 21:23 | 2021-07-15 | 02:59 |
| 4 | d | 2021-07-15 | 04:05 | 2021-07-15 | 09:41 |
| 5 | e | 2021-07-17 | 13:50 | 2021-07-18 | 08:49 |
| 6 | a | 2021-07-18 | 10:51 | 2021-07-18 | 12:27 |
| 7 | a | 2021-07-18 | 13:55 | 2021-07-19 | 06:26 |
| 8 | f | 2021-09-20 | 22:36 | 2021-09-20 | 23:19 |
| 9 | f | 2021-09-21 | 23:45 | 2021-09-23 | 10:12 |
期望输出
| col1 | col2 | col3 | col4 | col5 | |
|---|---|---|---|---|---|
| 0 | a | 2021-07-03 | 17:08 | 2021-07-04 | 10:41 |
| 1 | b | 2021-07-10 | 04:14 | 2021-07-11 | 04:32 |
| 2 | c | 2021-07-13 | 02:03 | 2021-07-14 | 00:45 |
| 3 | d | 2021-07-14 | 21:23 | 2021-07-15 | 09:41 |
| 4 | e | 2021-07-17 | 13:50 | 2021-07-18 | 08:49 |
| 5 | a | 2021-07-18 | 10:51 | 2021-07-19 | 06:26 |
| 6 | f | 2021-09-20 | 22:36 | 2021-09-23 | 10:12 |
解决方案(Python Pandas)
通过生成连续分组标识,再对分组进行聚合操作即可实现需求:
import pandas as pd # 构造示例数据 data = [ ["a", "2021-07-03", "17:08", "2021-07-04", "10:41"], ["b", "2021-07-10", "04:14", "2021-07-11", "04:32"], ["c", "2021-07-13", "02:03", "2021-07-14", "00:45"], ["d", "2021-07-14", "21:23", "2021-07-15", "02:59"], ["d", "2021-07-15", "04:05", "2021-07-15", "09:41"], ["e", "2021-07-17", "13:50", "2021-07-18", "08:49"], ["a", "2021-07-18", "10:51", "2021-07-18", "12:27"], ["a", "2021-07-18", "13:55", "2021-07-19", "06:26"], ["f", "2021-09-20", "22:36", "2021-09-20", "23:19"], ["f", "2021-09-21", "23:45", "2021-09-23", "10:12"] ] df = pd.DataFrame(data, columns=["col1", "col2", "col3", "col4", "col5"]) # 生成连续分组ID:当前行col1与上一行不同时,分组号累加 df["group_id"] = (df["col1"] != df["col1"].shift()).cumsum() # 分组聚合:提取对应字段的极值 result = df.groupby("group_id").agg( col1=("col1", "first"), col2=("col2", "min"), col3=("col3", "min"), col4=("col4", "max"), col5=("col5", "max") ).reset_index(drop=True) print(result)
关键步骤说明
- 生成连续分组标识:利用
shift()对比当前行与上一行的col1值,通过cumsum()生成唯一的连续分组ID,确保只有相邻相同的col1值被分到同一组。 - 聚合逻辑:
col1取组内第一个值(同一连续组内值一致)col2/col3用min()获取最早的日期和小时col4/col5用max()获取最晚的日期和小时
- 重置索引:去掉分组ID列,使输出索引与期望结果一致。
内容的提问来源于stack exchange,提问作者user14871576
相关产品推荐
相关产品推荐

