You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中正确设置条件,统计banner影响的有效订单数据

分析Banner事件对订单的影响(基于Pandas)

需求:分析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 18:46:13