按连续属性的最大时间块重组Pandas数据集(支持N属性)
合并连续相同属性的时间区间(向量化解决方案)
需求说明
将数据集按所有属性连续保持不变的最大时间块重组:当attribute_1、attribute_2等N个属性值完全相同时,合并对应的连续时间区间。由于数据集规模可能较大,需优先采用向量化方案提升处理效率。
输入输出示例
输入数据集
| start_date | end_date | attribute_1 | attribute_2 | |
|---|---|---|---|---|
| 0 | 2020-01-01 | 2020-02-01 | A | 1 |
| 1 | 2020-02-01 | 2020-03-01 | A | 1 |
| 2 | 2020-03-01 | 2020-04-01 | B | 1 |
| 3 | 2020-04-01 | 2020-05-01 | A | 1 |
| 4 | 2020-05-01 | 2020-06-01 | A | 1 |
| 5 | 2020-06-01 | 2020-07-01 | A | 2 |
期望输出
| start_date | end_date | attribute_1 | attribute_2 | |
|---|---|---|---|---|
| 0 | 2020-01-01 | 2020-03-01 | A | 1 |
| 1 | 2020-03-01 | 2020-04-01 | B | 1 |
| 2 | 2020-04-01 | 2020-06-01 | A | 1 |
| 3 | 2020-06-01 | 2020-07-01 | A | 2 |
可复现输入的代码
from datetime import datetime import pandas as pd start_dates = pd.date_range(start=datetime(2020, 1, 1), end=datetime(2020, 6, 1), freq="MS", inclusive="both") end_dates = pd.date_range(start=datetime(2020, 2, 1), end=datetime(2020, 7, 1), freq="MS", inclusive="both") df = pd.DataFrame({ "start_date": start_dates, "end_date": end_dates, "attribute_1": ["A", "A", "B", "A", "A", "A"], "attribute_2": [1, 1, 1, 1, 1, 2] })
向量化实现方案
利用Pandas内置的向量化操作标记连续属性分组,再通过分组聚合合并时间区间,全程避免Python循环,适合处理大规模数据集。
代码实现
# 生成连续相同属性的分组ID:属性变化时分组ID递增 df['group_id'] = (df[['attribute_1', 'attribute_2']] != df[['attribute_1', 'attribute_2']].shift()).any(axis=1).cumsum() # 按分组ID聚合,保留每组的起始/结束时间与属性值 result = df.groupby('group_id').agg( start_date=('start_date', 'first'), end_date=('end_date', 'last'), attribute_1=('attribute_1', 'first'), attribute_2=('attribute_2', 'first') ).reset_index(drop=True) print(result)
代码解释
- 标记分组ID:
- 使用
shift()将属性列向下偏移一行,与原列对比判断属性是否变化; any(axis=1)标记任意属性变化的行,cumsum()累加生成连续相同属性的分组ID。
- 使用
- 分组聚合:
- 按
group_id分组,取每组最早的start_date、最晚的end_date,属性值取组内第一个即可(同组属性完全一致)。
- 按
- 效率优势:
所有操作均为Pandas向量化运算,处理百万级数据的性能远高于逐行遍历方案。
运行结果
start_date end_date attribute_1 attribute_2 0 2020-01-01 2020-03-01 A 1 1 2020-03-01 2020-04-01 B 1 2 2020-04-01 2020-06-01 A 1 3 2020-06-01 2020-07-01 A 2
内容的提问来源于stack exchange,提问作者Odhian
相关产品推荐
相关产品推荐

