Pandas按personal_id计算application_id间的创建时间天数差
解决方案
核心思路是先提取每个用户(personal_id)下每个申请(application_id)的唯一时间戳,计算完间隔后再合并回原数据集,避免同一申请内多行数据干扰计算。
步骤说明
- 第一步:提取每个
personal_id+application_id对应的唯一时间戳,生成中间数据集(每个申请仅保留一行) - 第二步:按用户分组,对申请按时间排序后计算连续申请的天数间隔
- 第三步:将计算好的间隔值合并回原DataFrame,确保同一申请的所有行值一致
代码实现
假设你的原DataFrame名为df,且creation_timestamp已转为datetime类型(若未转换需先执行转换代码):
import pandas as pd # 确保时间列是datetime类型(如果还不是的话) df['creation_timestamp'] = pd.to_datetime(df['creation_timestamp']) # 1. 提取每个用户+申请的唯一时间戳 unique_applications = df.groupby(['personal_id', 'application_id'])['creation_timestamp'].first().reset_index() # 2. 按用户分组,按时间排序后计算连续申请的天数间隔 unique_applications = unique_applications.sort_values(['personal_id', 'creation_timestamp']) unique_applications['days_between_applications'] = unique_applications.groupby('personal_id')['creation_timestamp'].diff().dt.days # 3. 将间隔值合并回原DataFrame df = df.merge( unique_applications[['personal_id', 'application_id', 'days_between_applications']], on=['personal_id', 'application_id'], how='left' )
问题根源解释
你之前直接在原DataFrame上分组计算差值时,同一application_id下的多行数据时间戳相同,diff()会生成0.0;而跨申请的行才会得到正确的间隔值,导致同一申请内出现两种结果。通过先去重每个申请的唯一时间,再计算间隔,就能彻底避免这个问题。
补充调整
- 第一个申请的
days_between_applications会是NaN,你可以根据需求用fillna(0)填充为0,或者保留NaN表示无前置申请 - 如果你的数据中存在特殊关联逻辑(比如同一
application_id对应多个personal_id),可在分组和合并时调整对应字段
内容的提问来源于stack exchange,提问作者Alex Günsberg
相关产品推荐
相关产品推荐

