如何将矩形DataFrame转换为三角形DataFrame?
实现方案
先说下之前代码跑不通的原因:
- 传参搞反了:
cl.Triangle()要收的是原始待处理的DF1,你把目标DF2传进去了,逻辑从根上就错了 - 工具不匹配:chainladder 是精算场景专门处理流量三角形的库,默认识别事故期、发展期的标准格式,默认保留左下三角的已知值,和你要的逐行右向截断的上三角规则对不上,直接用不仅出不来正确结果,还容易报格式校验的错
最简便的实现(纯pandas/numpy几行搞定,无需依赖精算库)
你要的三角结构规则非常明确:从上到下逐行排列,第i行(第一行行号算0)只要列位置大于 总列数-1 - 行号 的单元格,全部填充为NaN,执行完即可和你给出的DF2结构完全对齐:
import pandas as pd import numpy as np # 复制原DF1,不改动原始数据 DF2 = DF1.copy() row_num, col_num = DF2.shape # 生成和DF2同形状的位置索引矩阵 col_pos = np.tile(np.arange(col_num), (row_num, 1)) row_pos = np.arange(row_num).reshape(-1, 1) # 标记需要清空为NaN的位置 drop_mask = col_pos > (col_num - 1 - row_pos) # 批量赋值 DF2.values[drop_mask] = np.nan
运行后的结果完全匹配目标要求:
- OP8、OP10 两行保留所有原始列的数值
- 从OP5开始,每往下一行,就把最右侧一列的数值清空为NaN
- 最后一行OP9 所有列均为NaN
关于chainladder的使用
如果后续要对转换好的三角结构做精算相关分析,直接把生成好的DF2传入cl.Triangle()就可以,没必要在数据格式转换环节依赖这个库,不然还得适配它的格式校验规则,反而增加不必要的麻烦。
内容的提问来源于stack exchange,提问作者Devil
相关产品推荐
相关产品推荐

