如何按ID组循环处理DataFrame,计算行日期差并标记状态?
问题需求
现有如下结构的DataFrame:
| id | date |
|---|---|
| a | 20-01-2020 |
| a | 22-03-2020 |
| a | 15-03-2020 |
| b | 05-02-2019 |
| b | 09-05-2019 |
需完成以下操作:
- 按
id分组,每组除首行外的每一行,计算当前行date与前一行date的天数差值 - 若差值<30或>56,在该行的
status列填入"no" - 若差值在30至56之间,在该行的
status列填入"yes" - 首行
status列留空
最终需输出如下结构的DataFrame:
| id | date | status |
|---|---|---|
| a | 20-01-2020 | |
| a | 20-03-2020 | yes |
| a | 15-04-2020 | no |
| b | 05-02-2019 | |
| b | 09-05-2019 | no |
解决方案
使用Pandas可以高效完成该任务,代码实现如下:
import pandas as pd # 构造初始数据 df = pd.DataFrame({ 'id': ['a', 'a', 'a', 'b', 'b'], 'date': ['20-01-2020', '22-03-2020', '15-03-2020', '05-02-2019', '09-05-2019'] }) # 转换日期格式为datetime类型(匹配日-月-年的输入格式) df['date'] = pd.to_datetime(df['date'], format='%d-%m-%Y') # 按id分组后对日期排序,保证每组内时间顺序正确 df = df.sort_values(by=['id', 'date']).reset_index(drop=True) # 计算每组内相邻日期的天数差 df['date_diff'] = df.groupby('id')['date'].diff().dt.days # 根据差值区间设置status列 df['status'] = pd.cut( df['date_diff'], bins=[-float('inf'), 30, 56, float('inf')], labels=['no', 'yes', 'no'] ) # 填充首行空值,删除临时计算列 df['status'] = df['status'].fillna('') df = df.drop(columns=['date_diff']) # 输出结果 print(df)
关键步骤说明
- 日期类型转换:将字符串日期转为Pandas可处理的
datetime类型,确保后续能正确计算日期差。 - 分组排序:初始数据中部分组的日期是乱序的,排序后才能保证相邻行是时间上的前后关系。
- 日期差计算:通过
groupby+diff实现组内相邻日期的差值计算,提取天数用于判断。 - 区间映射:用
pd.cut将差值映射到对应的"yes"/"no"标签,首行因无前置数据差值为NaN,填充为空字符串。
内容的提问来源于stack exchange,提问作者ii mm
相关产品推荐
相关产品推荐

