分组后获取最小时间差的实现方法
问题描述
给定如下数据结构:
df_columns = { 'firm_ID': [1, 1, 2, 2, 2], 'date_incident' : ['2015-01-01', '2015-01-01', '2016-10-01', '2016-10-01', '2016-10-01'], 'date_meeting' : ['2014-02-01', '2016-03-01', '2015-10-01', '2017-02-01', '2018-11-01'], } simple_df = pd.DataFrame(df_columns) simple_df['date_incident'] = pd.to_datetime(simple_df['date_incident']) simple_df['date_meeting'] = pd.to_datetime(simple_df['date_meeting']) simple_df['date_delta'] = simple_df['date_incident'] - simple_df['date_meeting']
每个firm_ID对应唯一的date_incident,但对应多个date_meeting。需要新增一列,返回每个firm_ID对应的最小date_delta(差值可为负数)。例如firm_ID=2时,最小时间差为-123天。
解决方案
使用pandas的分组聚合功能,按firm_ID分组后,通过transform('min')将每组的最小date_delta映射到原DataFrame的每一行:
# 新增min_date_delta列 simple_df['min_date_delta'] = simple_df.groupby('firm_ID')['date_delta'].transform('min')
结果验证
执行上述代码后,simple_df的输出如下:
| firm_ID | date_incident | date_meeting | date_delta | min_date_delta |
|---|---|---|---|---|
| 1 | 2015-01-01 | 2014-02-01 | 334 days | -60 days |
| 1 | 2015-01-01 | 2016-03-01 | -60 days | -60 days |
| 2 | 2016-10-01 | 2015-10-01 | 365 days | -123 days |
| 2 | 2016-10-01 | 2017-02-01 | -123 days | -123 days |
| 2 | 2016-10-01 | 2018-11-01 | -761 days | -123 days |
可以看到,firm_ID=2的最小date_delta为-123天,完全符合需求。
内容的提问来源于stack exchange,提问作者tab_stopp
相关产品推荐
相关产品推荐

