pandas如何按连续相同值分组统计每组的最小与最大日期
解决方法
这种对连续相同字段值分组统计的需求,通常被称为连续孤岛分组或者会话分组,pandas里可以通过位移+累加的方式完全向量化实现,不需要写循环。
完整实现代码
import pandas as pd # 构造测试数据 df = pd.DataFrame({ 'state': ['a', 'a', 'b', 'b', 'a', 'a'], 'date': pd.to_datetime(['2020-01-01', '2020-01-02', '2020-01-03', '2020-01-04', '2020-01-05', '2020-01-06']) }) # 【如果原始数据未按日期排序,先执行这一步】 # df = df.sort_values('date') # 核心逻辑:生成连续分组键 group_key = df['state'].ne(df['state'].shift()).cumsum() # 分组聚合得到结果 result = df.groupby([group_key, 'state'], as_index=False)['date'].agg( min_date='min', max_date='max' ).drop(columns=group_key.name) print(result)
逻辑说明
df['state'].ne(df['state'].shift()):将当前行的state值和上一行对比,不相等时返回True,代表新连续组的起始位置cumsum():对布尔值做累加,True会被当作1、False当作0,累加后相同的值就对应同一个连续state组- 按分组键+state分组聚合,取date的最小、最大值,即可得到目标结果
输出结果完全匹配需求:
state min_date max_date 0 a 2020-01-01 2020-01-02 1 b 2020-01-03 2020-01-04 2 a 2020-01-05 2020-01-06
内容的提问来源于stack exchange,提问作者Super Mario
相关产品推荐
相关产品推荐

