看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
在电商或零售数据分析中,识别重复订单和计算用户复购率是常见的业务需求。重复订单可能源于系统异常、用户误操作或恶意刷单;而复购率则是衡量客户忠诚度的重要指标。本文将通过一个模拟的订单数据集,演示如何使用 pandas 的 drop_duplicates、duplicated 和 groupby 等方法,快速清洗重复数据并计算每位用户的复购率。学完本案例,你将掌握如何结合多个 pandas 方法完成端到端的数据分析任务。
我们有如下订单记录(每条记录包含用户 ID、订单 ID 和下单时间):
import pandas as pd
from io import StringIO
data = """
user_id,order_id,order_time
101,A001,2025-01-10 09:30:00
102,B002,2025-01-11 14:20:00
101,A001,2025-01-10 09:30:00
103,C003,2025-01-12 16:45:00
102,B004,2025-02-01 10:15:00
101,A005,2025-02-05 11:00:00
104,D006,2025-01-15 13:00:00
102,B002,2025-01-11 14:20:00
"""
df = pd.read_csv(StringIO(data))
df['order_time'] = pd.to_datetime(df['order_time'])
需求描述:
正确结果应为:
首先,我们需要识别并删除完全重复的行,这可以通过 drop_duplicates() 实现。接着,为了判断哪些用户发生了复购,我们可以按 user_id 分组,统计每个用户的订单数量。然后,筛选出订单数 ≥2 的用户,计算其占总用户数的比例。整个过程可以借助链式调用,使代码简洁高效:先去重,再分组计数,最后用布尔索引和均值技巧快速求比例。
代码如下:
repurchase_rate = (
df
.drop_duplicates() # 去除完全重复的订单
.groupby('user_id') # 按用户分组
.size() # 统计每个用户的订单数
.ge(2) # 判断是否 ≥2(返回布尔 Series)
.mean() # 布尔值求平均即为复购率(True=1, False=0)
)
print(f"用户复购率为: {repurchase_rate:.2f}")
# 用户复购率为: 0.50
代码分析:
drop_duplicates() 默认检查所有列,自动剔除完全相同的行;groupby('user_id').size() 返回每个用户的订单总数(比 count() 更适合,因不跳过 NaN);.ge(2) 是 “greater than or equal to 2” 的向量化写法,等价于 >= 2,生成布尔序列;.mean() 是 pandas 中计算比例的经典技巧——True 视为 1,False 视为 0,平均值即为 True 的占比。这段代码仅用 5 行就完成了从数据清洗到业务指标计算的全过程,充分体现了 pandas 链式操作的表达力与效率。
(完)
更新时间:2025-11-18 19:54:18 标签:pandas python 复购率 重复订单