基于日期列获取Pandas DataFrame中用户最后短信日的首次操作信息
解决方案
步骤1:转换日期列(可选但推荐)
先将日期列转为datetime类型,确保日期比较逻辑准确:
df['sms_sent_date'] = pd.to_datetime(df['sms_sent_date'], format='%d-%m-%Y') df['Action_date'] = pd.to_datetime(df['Action_date'], format='%d-%m-%Y')
步骤2:筛选每个用户最后短信日期的行
用groupby+transform获取每个用户的最大短信日期,然后过滤出对应行:
# 获取每个用户的最后短信发送日期 last_sms_date = df.groupby('Id')['sms_sent_date'].transform('max') # 筛选出最后短信日期的所有行 filtered_df = df[df['sms_sent_date'] == last_sms_date]
步骤3:提取每个用户的首次操作记录
在筛选后的结果中,按Id分组并取每组的第一行(对应首次action_performed):
result = filtered_df.groupby('Id').first().reset_index()
完整代码
import pandas as pd # 构造示例数据 data = { 'Id': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'], 'sms_sent_date': ['21-11-2021', '22-11-2021', '23-11-2021', '23-11-2021', '23-11-2021', '11-12-2021', '12-12-2021', '12-12-2021', '12-12-2021'], 'sms_number': [1, 2, 3, 3, 3, 1, 2, 2, 2], 'Action_date': ['21-11-2021', '22-11-2021', '23-11-2021', '23-11-2021', '23-11-2021', '11-12-2021', '12-12-2021', '12-12-2021', '12-12-2021'], 'action_performed': ['opened', 'clicked', 'opened', 'proceeded', 'halted', 'opened', 'opened', 'clicked', 'succeded'] } df = pd.DataFrame(data) # 转换日期列 df['sms_sent_date'] = pd.to_datetime(df['sms_sent_date'], format='%d-%m-%Y') df['Action_date'] = pd.to_datetime(df['Action_date'], format='%d-%m-%Y') # 筛选最后短信日期的行 last_sms_date = df.groupby('Id')['sms_sent_date'].transform('max') filtered_df = df[df['sms_sent_date'] == last_sms_date] # 提取首次操作记录 result = filtered_df.groupby('Id').first().reset_index() # 转换回原日期格式(可选) result['sms_sent_date'] = result['sms_sent_date'].dt.strftime('%d-%m-%Y') result['Action_date'] = result['Action_date'].dt.strftime('%d-%m-%Y') print(result)
输出结果
Id sms_sent_date sms_number Action_date action_performed 0 A 23-11-2021 3 23-11-2021 opened 1 B 12-12-2021 2 12-12-2021 opened
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

