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

如何在Pandas中添加列标记当前月或上月任一为0的客户?

解决DataFrame标记非活跃客户列的问题

错误原因分析

你遇到的错误主要来自两个问题:

  1. 自定义函数里误用了位运算符|,Python条件判断中应使用逻辑运算符or;
  2. 最后一行代码存在笔误:调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 02:01:17