技术问询:排除与正值绝对值相同的负值(附保单数据集)
保单数据集过滤:移除同PolicyNumber下对应相同绝对值正值的负值记录
嘿,我来帮你搞定这个保单数据的过滤需求!先明确目标:移除每个PolicyNumber分组中,与该组内某个正值绝对值完全相等的负值数据;而那些没有对应正值的负值、以及所有正值都需要保留。
原始数据集
先把你提供的原始数据整理成清晰的表格:
| PolicyNumber | Premium | Commission | DataSource | EffectiveDate |
|---|---|---|---|---|
| 1 | -2.25 | -0.41 | Internal | 31/03/2018 |
| 1 | 160.26 | 29.14 | Internal | 31/03/2018 |
| 1 | 98.81 | 17.96 | Internal | 31/03/2018 |
| 2 | 361.24 | 65.67 | Internal | 31/01/2018 |
| 2 | 570.35 | 103.70 | Internal | 31/01/2018 |
| 2 | -17.05 | -3.10 | Internal | 31/01/2018 |
| 3 | 240.60 | 0.00 | External | 31/01/2018 |
| 3 | 196.64 | 0.00 | External | 31/01/2018 |
| 3 | 240.60 | 0.00 | External | 31/01/2018 |
| 3 | 196.64 | 0.00 | External | 31/01/2018 |
| 3 | -240.60 | 0.00 | External | 28/02/2018 |
| 3 | -196.64 | 0.00 | External | 28/02/2018 |
处理方案(Python Pandas实现)
用Python的Pandas库来处理这类分组过滤需求最顺手,下面是完整的代码和步骤解释:
import pandas as pd # 1. 构造/加载数据集 # 如果是从文件读取,替换成 df = pd.read_csv('你的保单数据文件.csv') data = { 'PolicyNumber': [1,1,1,2,2,2,3,3,3,3,3,3], 'Premium': [-2.25, 160.26, 98.81, 361.24, 570.35, -17.05, 240.60, 196.64, 240.60, 196.64, -240.60, -196.64], 'Commission': [-0.41, 29.14, 17.96, 65.67, 103.70, -3.10, 0.00, 0.00, 0.00, 0.00, 0.00, 0.00], 'DataSource': ['Internal']*6 + ['External']*6, 'EffectiveDate': ['31/03/2018']*3 + ['31/01/2018']*3 + ['31/01/2018']*4 + ['28/02/2018']*2 } df = pd.DataFrame(data) # 2. 定义分组过滤函数 def filter_policy_group(group): # 收集当前PolicyNumber下所有正的Premium值(用集合提高查找效率) positive_premiums = set(group[group['Premium'] > 0]['Premium']) # 筛选规则:保留正Premium行,或负Premium行但绝对值不在正Premium集合中 keep_rows = (group['Premium'] > 0) | (~group['Premium'].abs().isin(positive_premiums)) return group[keep_rows] # 3. 按PolicyNumber分组并应用过滤 filtered_df = df.groupby('PolicyNumber').apply(filter_policy_group).reset_index(drop=True) # 4. 查看结果 print(filtered_df)
处理后的结果
运行代码后,得到的过滤后数据如下:
| PolicyNumber | Premium | Commission | DataSource | EffectiveDate |
|---|---|---|---|---|
| 1 | -2.25 | -0.41 | Internal | 31/03/2018 |
| 1 | 160.26 | 29.14 | Internal | 31/03/2018 |
| 1 | 98.81 | 17.96 | Internal | 31/03/2018 |
| 2 | 361.24 | 65.67 | Internal | 31/01/2018 |
| 2 | 570.35 | 103.70 | Internal | 31/01/2018 |
| 2 | -17.05 | -3.10 | Internal | 31/01/2018 |
| 3 | 240.60 | 0.00 | External | 31/01/2018 |
| 3 | 196.64 | 0.00 | External | 31/01/2018 |
| 3 | 240.60 | 0.00 | External | 31/01/2018 |
| 3 | 196.64 | 0.00 | External | 31/01/2018 |
可以看到:
- Policy3中的
-240.60和-196.64被移除了,因为同组内存在对应绝对值的正值 - Policy1的
-2.25和Policy2的-17.05被保留,因为同组内没有匹配的正值
内容的提问来源于stack exchange,提问作者Adhitya Sanusi
相关产品推荐
相关产品推荐

