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

如何在Pandas DataFrame中按多条件实现pending_amt分箱分类?

解决方法

你的需求包含两个特殊优先级的类别,无法直接通过pd.cut一次性完成,需要先处理特殊情况,再对剩余数据分箱:

1. 构造原始数据

先还原你的初始DataFrame:

import pandas as pd
import numpy as np

data = {
    'Id': ['A', 'B', 'C', 'D', 'E'],
    'Total_amt': [100, 200, 500, 1000, 2000],
    'amt_paid': [0, 20, 500, 400, 100],
    'pending_amt': [100, 180, 0, 600, 1900]
}
df = pd.DataFrame(data)

2. 处理特殊类别

先通过条件判断设置两个特殊状态:

  • Payment_Completed:当pending_amt为0时(全额付清)
  • No_Payment_Made:当amt_paid为0且pending_amt不为0时(完全未付款)
# 初始化status列,优先填充特殊状态
df['status'] = np.where(
    df['pending_amt'] == 0,
    'Payment_Completed',
    np.where(df['amt_paid'] == 0, 'No_Payment_Made', '')
)

3. 用pd.cut处理剩余分箱

对还未设置status的行,按pending_amt的数值范围分箱:

# 定义分箱边界和对应标签
bins = [-np.inf, 250, 750, np.inf]
labels = ['< 250', '250-750', '> 750']

# 筛选出未设置status的行,应用分箱
mask = df['status'] == ''
df.loc[mask, 'status'] = pd.cut(
    df.loc[mask, 'pending_amt'],
    bins=bins,
    labels=labels,
    include_lowest=True
)

最终结果

运行后得到的DataFrame与预期完全一致:

Id  Total_amt  amt_paid  pending_amt           status
0  A        100         0          100  No_Payment_Made
1  B        200        20          180           < 250
2  C        500       500            0  Payment_Completed
3  D       1000       400          600         250-750
4  E       2000       100         1900            > 750

内容的提问来源于stack exchange,提问作者Roshankumar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 21:02:09