如何在Pandas中正确设置条件,统计banner影响的有效订单数据
需求:分析banner_show和banner_click事件对订单的影响,仅统计订单时间晚于对应事件时间的情况,最终得到符合条件的唯一用户数量及对应订单总数。
示例数据
user title time 0 user_0 banner_click 2017-02-09 20:24:04 1 user_0 order 2017-03-20 19:24:04 # user0点击banner后下单,需统计 2 user_1 banner_show 2017-04-14 20:24:04 3 user_1 order 2017-02-04 20:24:04 # user1先下单后看banner,不统计 4 user_2 order 2017-08-12 20:24:04 # user2在点击banner后下单,需统计 5 user_2 order 2017-03-12 20:24:04 6 user_2 banner_click 2017-08-11 20:24:04
你尝试的代码(存在问题)
banner_click = set(df.loc[df['title'].eq('banner_click'), 'user']) order = set(df.loc[df['title'].eq('order'), 'user']) unique_user_buy_from_click= len(banner_click & order) print(unique_user_buy)
该代码仅通过用户交集判断,未考虑时间先后顺序,会错误统计先下单后触发Banner事件的用户,也无法区分有效订单。
正确解决方案
步骤1:完善可复现数据并转换时间格式
首先补充时间列并将其转为datetime类型,确保能进行时间比较:
import pandas as pd # 带时间的可复现数据 df = pd.DataFrame({ 'user': ['user_0', 'user_0', 'user_1', 'user_1', 'user_2', 'user_2','user_2'], 'title': ['banner_click', 'order', 'banner_show', 'order', 'order','order','banner_click'], 'time': ['2017-02-09 20:24:04', '2017-03-20 19:24:04', '2017-04-14 20:24:04', '2017-02-04 20:24:04', '2017-08-12 20:24:04', '2017-03-12 20:24:04', '2017-08-11 20:24:04'] }) # 转换时间列为datetime类型,支持时间比较 df['time'] = pd.to_datetime(df['time'])
步骤2:筛选有效订单并计算结果
通过分组关联用户的Banner事件时间,过滤出符合时间要求的订单:
# 提取所有订单数据 orders = df[df['title'] == 'order'].reset_index(drop=True) # 按用户分组,获取每个用户最早的Banner事件时间(只要有一个Banner事件在订单前,订单即有效) user_banner_min_time = df[df['title'].isin(['banner_show', 'banner_click'])] \ .groupby('user')['time'].min().reset_index(name='min_banner_time') # 关联订单数据与用户的Banner事件时间 orders_with_banner = orders.merge(user_banner_min_time, on='user', how='left') # 过滤出订单时间晚于最早Banner事件时间的有效订单 valid_orders = orders_with_banner[orders_with_banner['time'] > orders_with_banner['min_banner_time']] # 计算目标结果 unique_valid_users = valid_orders['user'].nunique() total_valid_orders = len(valid_orders) print(f"唯一有效用户数:{unique_valid_users}") print(f"总有效订单数:{total_valid_orders}")
输出结果
唯一有效用户数:2 总有效订单数:2
完全符合预期(user_0和user_2的有效订单各1个)。
内容的提问来源于stack exchange,提问作者User_001
相关产品推荐
相关产品推荐

