正确姿势是用 shift(1) 获取前一步人数再相除,首行转化率设为 1.0,需预排序、防零除、避 SettingWithCopyWarning,pct_change() 不适用因它算增长比而非留存比。

用 shift() 计算漏斗各环节转化率的正确姿势
直接对漏斗步骤人数列用 shift(-1) 除以当前行,会得到“下一步 / 当前步”——这其实是流失率的倒数,但容易错当成转化率。真正要的是“后一步人数 / 前一步人数”,即从上往下流,所以必须用 shift(1) 得到前一步人数,再做除法。
常见错误是写成 df['conversion'] = df['count'] / df['count'].shift(-1),结果第一行就变成 NaN(因为 shift(-1) 把首行推没了),且语义反了。
- 正确顺序:按步骤顺序排序后,用
shift(1)拿前一环节人数 - 首行转化率无定义,应显式设为
1.0或np.nan,别依赖默认填充 - 务必确认数据已按漏斗顺序排好(如
step_order列升序),否则shift会跨环节错位
处理缺失值和边界情况的实际操作
漏斗中某环节人数为 0 时,0 / 0 得 nan,而 x / 0(x>0)得 inf——这两种都不该出现在报表里。不能只靠 .replace([np.inf, -np.inf], np.nan) 了事。
- 在除法前加判断:
np.where(df['prev_count'] == 0, np.nan, df['count'] / df['prev_count']) - 如果业务允许“0→0”视为 100%(比如该环节无用户进入也无用户离开),需单独逻辑覆盖
- 用
pd.options.mode.chained_assignment = None避免 SettingWithCopyWarning 干扰调试
为什么不用 diff() 或 pct_change()?
pct_change() 看似省事,但它计算的是 (x - x_prev) / x_prev,即“增长百分比”,不是“留存比例”。比如从 100 人掉到 60 人,pct_change() 返回 -0.4(-40%),而你需要的是 0.6(60% 转化率)。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
-
diff()更不适用——它返回绝对差值,无法表达比例关系 -
shift(1)+ 除法是唯一能精确表达“本环节人数占上环节比例”的基础操作 - 若需累计转化率(如从第一步到第三步),应链式相乘,而非对原始计数再
shift
完整可跑示例(含防错)
import pandas as pd
import numpy as np
<p>df = pd.DataFrame({
'step': ['visit', 'login', 'cart', 'pay'],
'count': [1200, 840, 320, 192]
})
df = df.sort_values('step').reset_index(drop=True) # 确保顺序</p><p>df['prev_count'] = df['count'].shift(1)
df['conversion'] = np.where(
df['prev_count'] == 0,
np.nan,
df['count'] / df['prev_count']
)
df.loc[0, 'conversion'] = 1.0 # 首步定义为 100%</p>
输出中 conversion 列为 [1.0, 0.7, 0.38095..., 0.6],对应 login/visit、cart/login、pay/cart 的转化率。注意第三步是 320/840 ≈ 0.381,不是 840/1200 ——顺序和分母选择必须严格匹配业务定义。
漏斗分析最易出错的不是公式,而是步骤顺序错位、空值未过滤、0 值未兜底这三处。只要数据排序和边界检查到位,shift(1) 就是最稳的起点。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










