如何在Pandas中按ID计算CV与对应Visit的日期间隔
解决方案
首先,我们需要先将日期列转换为可计算的datetime类型,再按ID分组,为每个CV匹配最近的、发生在它之前的Visit日期,最后计算天数差。以下是完整实现步骤:
步骤1:转换日期格式
先把date列从字符串转为Pandas的datetime类型,这样才能进行日期运算:
import pandas as pd data1 = {'ID': ['A2A', 'A2A', 'A2A', 'BB3', 'BB3', 'BB3', '5EE', '5EE'], 'Action': ['Visit', 'CV', 'CV', 'Visit', 'Visit', 'CV', 'Visit', 'CV'], 'date': ['2023/4/1', '2023/4/5', '2023/4/7', '2023/5/5', '2023/5/29', '2023/5/30', '2023/6/1', '2023/6/10']} df = pd.DataFrame(data1) # 转换日期列 df['date'] = pd.to_datetime(df['date'])
步骤2:为每个CV匹配对应Visit日期
按ID分组后,我们需要为每一行填充最近的前置Visit日期。这里可以通过临时标记Visit日期,再向前填充的方式实现:
# 临时列:仅保留Visit行的日期,CV行设为缺失值 df['visit_date'] = df.apply(lambda x: x['date'] if x['Action'] == 'Visit' else pd.NA, axis=1) # 按ID分组后向前填充,让每个CV自动匹配最近的前置Visit日期 df['visit_date'] = df.groupby('ID')['visit_date'].ffill()
步骤3:计算CV与Visit的天数差
直接用CV日期减去对应Visit日期,提取天数数值,Visit行可设为缺失值(也可根据需求改为0):
# 计算天数差,仅CV行生成有效数值 df['CV_days_after_visit'] = df.apply( lambda x: (x['date'] - x['visit_date']).days if x['Action'] == 'CV' else pd.NA, axis=1 )
最终结果
运行后得到的DataFrame如下:
ID Action date visit_date CV_days_after_visit 0 A2A Visit 2023-04-01 2023-04-01 NaN 1 A2A CV 2023-04-05 2023-04-01 4.0 2 A2A CV 2023-04-07 2023-04-01 6.0 3 BB3 Visit 2023-05-05 2023-05-05 NaN 4 BB3 Visit 2023-05-29 2023-05-29 NaN 5 BB3 CV 2023-05-30 2023-05-29 1.0 6 5EE Visit 2023-06-01 2023-06-01 NaN 7 5EE CV 2023-06-10 2023-06-01 9.0
如果不需要临时的visit_date列,可最后执行df.drop('visit_date', axis=1)删除。
内容的提问来源于stack exchange,提问作者StephL
相关产品推荐
相关产品推荐

