如何在Pandas中按连续分组(姓名+CAR_ID)重置计算最小日期?
Pandas实现连续分组的最小日期计算
要实现按连续出现的(姓名+CAR_ID)组合分组,计算每组的最小DATE值,核心是先创建基于序列顺序的分组标识,再进行分组计算。具体步骤如下:
1. 确保日期列格式正确
先将DATE列转为datetime类型,避免字符串比较导致的错误:
import pandas as pd # 假设你的数据集是df df['DATE'] = pd.to_datetime(df['DATE'])
2. 创建连续分组标识
通过对比当前行与上一行的姓名、CAR_ID是否一致,生成连续分组的ID:
# 当任意一个字段(姓名/CAR_ID)与上一行不同时,标记为新分组,累加得到分组ID df['continuous_group'] = ( (df['FIRST_NAME'] != df['FIRST_NAME'].shift()) | (df['LAST_NAME'] != df['LAST_NAME'].shift()) | (df['CAR_ID'] != df['CAR_ID'].shift()) ).cumsum()
这里的shift()方法用来获取上一行的字段值,cumsum()会将每次字段变化的标记累加,生成唯一的连续分组ID。
3. 计算每个连续分组的最小日期
用transform('min')直接将分组计算的最小日期映射回原数据集,无需额外合并操作:
df['MIN_DATE'] = df.groupby('continuous_group')['DATE'].transform('min')
4. (可选)清理辅助列
如果不需要保留分组标识列,可以删除:
df = df.drop('continuous_group', axis=1)
效果示例
假设原数据如下:
| FIRST_NAME | LAST_NAME | CAR_ID | DATE |
|---|---|---|---|
| Alice | Smith | 1 | 2023-01-01 |
| Alice | Smith | 1 | 2023-01-03 |
| Alice | Smith | 2 | 2023-01-05 |
| Alice | Smith | 1 | 2023-01-07 |
处理后得到的MIN_DATE列:
| FIRST_NAME | LAST_NAME | CAR_ID | DATE | MIN_DATE |
|---|---|---|---|---|
| Alice | Smith | 1 | 2023-01-01 | 2023-01-01 |
| Alice | Smith | 1 | 2023-01-03 | 2023-01-01 |
| Alice | Smith | 2 | 2023-01-05 | 2023-01-05 |
| Alice | Smith | 1 | 2023-01-07 | 2023-01-07 |
这种方法区别于普通groupby(['FIRST_NAME','LAST_NAME','CAR_ID']),后者会把所有相同组合的行归为一组(比如上面示例中第1、2、4行),而我们的方案仅将连续出现的相同组合视为独立分组,符合你的需求。
内容的提问来源于stack exchange,提问作者suchathingasastupidquestion
相关产品推荐
相关产品推荐

