按保单号(Policy_no)分区设置条件标记的逻辑实现求助
按保单号分组设置标记的逻辑实现方案
你的需求与数据集
先明确下你的核心需求和数据集:
原始数据集
| Policy_no | role |
|---|---|
| 1 | 'Owner' |
| 1 | 'Beneficiary' |
| 1 | 'Beneficiary' |
| 2 | 'Owner' |
| 2 | 'Life assured' |
| 3 | 'Life assured' |
标记规则
- 按
Policy_no分组 - 分组内存在Owner角色:标记设为'1'
- 分组内无Owner角色:仅当存在Life assured角色时设置标记为'1'
- 标记逻辑互斥:只要分组有Owner,就不再考虑Life assured的情况
解决方案(Python Pandas)
用Pandas处理这类分组逻辑非常方便,核心思路是按保单号分组后,优先判断Owner是否存在,再处理Life assured的情况:
import pandas as pd # 构造你的数据集 data = { 'Policy_no': [1, 1, 1, 2, 2, 3], 'role': ['Owner', 'Beneficiary', 'Beneficiary', 'Owner', 'Life assured', 'Life assured'] } df = pd.DataFrame(data) # 用transform快速生成标记列 df['flag'] = df.groupby('Policy_no')['role'].transform( lambda x: '1' if ('Owner' in x) else ('1' if 'Life assured' in x else '0') ) # 查看结果 print(df)
结果输出
Policy_no role flag 0 1 Owner 1 1 1 Beneficiary 1 2 1 Beneficiary 1 3 2 Owner 1 4 2 Life assured 1 5 3 Life assured 1
解决方案(SQL)
如果你是用SQL处理数据库中的数据,逻辑是一样的,用CASE结合EXISTS子查询实现:
SELECT Policy_no, role, CASE -- 优先判断当前保单是否有Owner WHEN EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Policy_no = t1.Policy_no AND t2.role = 'Owner' ) THEN '1' -- 没有Owner时,判断是否有Life assured WHEN EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.Policy_no = t1.Policy_no AND t2.role = 'Life assured' ) THEN '1' -- 其他情况标记为0(可根据需求调整) ELSE '0' END AS flag FROM your_table t1;
逻辑说明
这里的关键是优先级判断:只要分组内存在Owner,就直接标记为'1',不会再去检查Life assured;只有当分组完全没有Owner的时候,才会验证是否存在Life assured,完美符合你“标记不能同时对应Owner和Life assured”的要求。
内容的提问来源于stack exchange,提问作者EkulSregor
相关产品推荐
相关产品推荐

