Pandas按客户满足金额需求生成remark列问题求助
解决方案
先构造你提供的示例DataFrame:
import pandas as pd data = { 'client': [123,123,456,456,456], 'scrip': ['A','B','A','X','Z'], 'Value': [1000,5000,2000,15000,70000], 'amt require': [500,500,50000,50000,50000] } df = pd.DataFrame(data)
接下来定义分组处理函数,实现你需要的标记逻辑:
def process_group(group): # 初始化remark列 group['remark'] = '' # 检查是否有单行满足Value≥对应amt require single_meet = group['Value'] >= group['amt require'] if single_meet.any(): # 定位第一个满足条件的行 first_meet_idx = single_meet.idxmax() group.loc[first_meet_idx, 'remark'] = '将被纳入' # 标记该行之后的所有行 group.loc[group.index > first_meet_idx, 'remark'] = '无需处理,已满足需求' else: # 计算累计Value group['cum_value'] = group['Value'].cumsum() # 获取当前client的需求额度(假设同client额度一致) req = group['amt require'].iloc[0] # 定位累计值首次达标行 cum_meet = group['cum_value'] >= req first_cum_meet_idx = cum_meet.idxmax() # 标记累计达标前的所有行(含达标行) group.loc[group.index <= first_cum_meet_idx, 'remark'] = '将被纳入' # 标记后续行 group.loc[group.index > first_cum_meet_idx, 'remark'] = '无需处理,已满足需求' # 删除临时累计列 group = group.drop('cum_value', axis=1) return group # 按client分组应用处理逻辑 df = df.groupby('client', group_keys=False).apply(process_group)
执行后得到的最终结果:
client scrip Value amt require remark 0 123 A 1000 500 将被纳入 1 123 B 5000 500 无需处理,已满足需求 2 456 A 2000 50000 将被纳入 3 456 X 15000 50000 将被纳入 4 456 Z 70000 50000 将被纳入
逻辑说明
- 对于
client=123:第一行Value=1000已满足额度要求,直接标记该行,后续行无需处理。 - 对于
client=456:单行均不满足要求,累计到第三行时总和达标,因此前三行全部标记为“将被纳入”。
内容的提问来源于stack exchange,提问作者Foram
相关产品推荐
相关产品推荐

