如何在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
相关产品推荐
相关产品推荐

