Pandas按账号分组求余额低于放款额5%的最小日期且不生成分组新df的方法
实现方法
核心逻辑
- 先筛选出所有满足*本金余额低于放款额5%*条件的行
- 按
account_number分组取符合条件行的period_date最小值 - 将最小值按账号映射回原DataFrame的所有对应行,无符合条件记录的账号自动填充空值
可直接运行的代码
你可以用transform方法一行实现,无需额外生成分组后的新表:
df['churn_date'] = df[df['principal_balance_amt'] <= 0.05 * df['disbursement_amt']]\ .groupby('account_number')['period_date']\ .transform('min')
也可以分两步写,可读性更强:
# 先计算每个账号符合条件的最小日期映射表 account_min_date = df[df['principal_balance_amt'] <= 0.05 * df['disbursement_amt']]\ .groupby('account_number')['period_date'].min() # 映射到原表新增列 df['churn_date'] = df['account_number'].map(account_min_date)
原代码错误说明
你之前的代码存在语法和逻辑双重问题:
groupby必须绑定DataFrame对象调用,不能直接写groupby('account_number')- 筛选条件不能嵌套在
groupby方法内部,需要提前过滤或者在分组后指定筛选逻辑 - 直接取分组后的
min()返回的是索引为账号的Series,和原表的行索引不匹配,无法直接赋值给新列,需要用transform或者map做对齐
内容的提问来源于stack exchange,提问作者Oskar Söderlund
相关产品推荐
相关产品推荐

