如何在Pandas中添加列标记当前月或上月任一为0的客户?
解决DataFrame标记非活跃客户列的问题
错误原因分析
你遇到的错误主要来自两个问题:
- 自定义函数里误用了位运算符
|,Python条件判断中应使用逻辑运算符or; - 最后一行代码存在笔误:调用
pivot.apply但你的DataFrame变量名是pivot2,导致引用错误。
另外,逐行apply的方式在处理大数据量时效率极低,更推荐用pandas的矢量化操作实现需求。
最优解决方案(矢量化操作)
直接利用pandas的元素级逻辑判断生成目标列,简洁高效:
# 标记当前月或上月任一未付款的客户(1=符合条件,0=两月均付款) pivot2['Inactive_Either'] = ((pivot2['Current_Month'] == 0) | (pivot2['Prior_Month'] == 0)).astype(int)
- 这里用
|是pandas矢量化操作中的元素级逻辑或,必须给每个条件加括号(避免运算符优先级问题); - 布尔值转整数时,
True自动转为1,False转为0,完全匹配你的需求。
修复原代码的方案
如果一定要保留自定义函数的写法,修正后的代码如下:
def categorise(row): # 逻辑运算符改用or,而非位运算符| if row['Current_Month'] > 0 or row['Prior_Month'] > 0: return 0 else: return 1 # 修正笔误:用pivot2.apply而非pivot.apply pivot2['Inactive_Either'] = pivot2.apply(categorise, axis=1).astype(float)
补充说明
- 矢量化操作是pandas的核心优势,比逐行
apply的速度快数倍甚至数十倍,数据量越大差异越明显; - 你需求的“标记当前月或上月任一未付款的客户”,等价于“排除两月均有付款的客户”,两种逻辑可以互换,代码里的判断逻辑完全一致。
内容的提问来源于stack exchange,提问作者Tomalak2Pi
相关产品推荐
相关产品推荐

