基于条件从指定行向下填充:标记保单问题行及后续行
保单问题版本及后续记录标记方案
现有一张记录保单交易信息的表格,当某保单的某一行中IssueFoundOnThisVersion字段为'Y'时,代表该保单存在特定问题。需要新增一列,将该'Y'所在行及同保单的所有后续行标记为1。核心需求是识别每个保单生命周期中出现问题的版本,以及该版本之后的所有同保单记录,目前不确定正确的分区处理方式。
示例数据
| PolicyNum | TransactionDate | PolicyVersion | IssueFoundOnThisVersion | DesiredResult |
|---|---|---|---|---|
| A12345 | 2023-01-01 | 1 | N | 0 |
| A12345 | 2023-06-01 | 2 | Y | 1 |
| A12345 | 2023-07-01 | 3 | N | 1 |
| A12345 | 2024-08-01 | 4 | N | 1 |
| A12346 | 2023-02-01 | 1 | N | 0 |
| A12346 | 2023-03-01 | 2 | N | 0 |
| A12346 | 2023-07-01 | 3 | N | 0 |
| A12346 | 2023-08-01 | 4 | Y | 1 |
| A12346 | 2024-01-01 | 5 | N | 1 |
解决方案
核心逻辑
按PolicyNum对数据分区,每个分区内按PolicyVersion(或TransactionDate,二者通常递增一致)排序,累计统计当前行及之前是否出现过'Y',只要出现过一次,后续所有行就标记为1。
SQL实现(适用于Spark SQL、BigQuery等)
SELECT PolicyNum, TransactionDate, PolicyVersion, IssueFoundOnThisVersion, CASE WHEN SUM(CASE WHEN IssueFoundOnThisVersion = 'Y' THEN 1 ELSE 0 END) OVER ( PARTITION BY PolicyNum ORDER BY PolicyVersion ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) >= 1 THEN 1 ELSE 0 END AS DesiredResult FROM your_table;
Pandas实现(Python)
import pandas as pd # 加载数据 df = pd.read_csv('your_data_file.csv') # 分组计算标记:按保单号分组,统计累计出现Y的情况,转换为0/1 df['DesiredResult'] = df.groupby('PolicyNum')['IssueFoundOnThisVersion'] \ .apply(lambda x: x.eq('Y').cumsum().ge(1).astype(int)) \ .reset_index(level=0, drop=True) # 查看结果 print(df)
内容的提问来源于stack exchange,提问作者Denzo37
相关产品推荐
相关产品推荐

