Pandas如何按patient_ID分组判断保险类型并生成新列
患者保险类型分类标记实现方案
需求说明
处理患者就诊保险数据时,已将保险统一归为Public(公立)、Private(私立)两类,需要新增Simple列实现以下规则:
- 按
patient_ID分组,同一患者的所有就诊记录为一组 - 若组内
Public_Private取值同时包含公立、私立两类,该组所有行的Simple列标记为Mixed - 若组内
Public_Private取值完全一致,Simple列直接返回对应的保险类型值 - 方案需要适配不同患者不等长的就诊记录数,不需要提前固定分组长度
原始数据集构造代码
import pandas as pd data = {'patient_ID': [1,1,1,2,2,3,3,3,4,4,4,4], 'Public_Private': ['Public', 'Public', 'Public', 'Private', 'Public','Private', 'Private', 'Private', 'Private', 'Public', 'Private', 'Public']} df = pd.DataFrame(data)
实现代码
通过pandas分组转换功能直接实现,无需额外合并操作:
df['Simple'] = df.groupby('patient_ID')['Public_Private'].transform( lambda group: 'Mixed' if group.nunique() > 1 else group.iloc[0] )
逻辑说明
groupby('patient_ID')按患者ID自动拆分数据分组,天然支持每个患者任意条数的就诊记录transform方法会将分组计算的结果按原表索引映射回每一行,不需要手动做表关联group.nunique()统计当前分组内保险类型的唯一值数量:数量大于1说明患者使用了多类保险,标记为Mixed;数量为1说明保险类型统一,直接取组内任意位置的值即可(全组值一致,取第一个值无歧义)
运行结果
执行代码后输出的数据集符合规则要求,若某患者同时存在两类保险记录,代码会自动识别标记为Mixed,不需要调整逻辑:
| patient_ID | Public_Private | Simple |
|---|---|---|
| 1 | Public | Public |
| 1 | Public | Public |
| 1 | Public | Public |
| 2 | Private | Mixed |
| 2 | Public | Mixed |
| 3 | Private | Private |
| 3 | Private | Private |
| 3 | Private | Private |
| 4 | Private | Mixed |
| 4 | Public | Mixed |
| 4 | Private | Mixed |
| 4 | Public | Mixed |
内容的提问来源于stack exchange,提问作者c_hornung
相关产品推荐
相关产品推荐

