如何高效基于pandas DataFrame其他行数据更新指定行的疫苗状态
Pandas 百万行级等效疫苗状态更新方案
核心思路完全基于Pandas原生向量化操作,避免Python层级的行遍历,适配200万行及以上的数据量,性能损耗极低,无需关心等效疫苗行是否相邻。
实现逻辑
- 先为所有疫苗划分等效组:把属于同一等效关系的疫苗映射到同一个分组ID,非等效疫苗单独分组
- 按「患者ID + 等效组」聚合,统计每个分组内是否存在已接种的记录
- 基于规则批量更新状态:
- 原状态为
Ok的行直接保留原有状态 - 原状态为
Missing的行,若所属分组存在已接种记录,更新为Applied equivalent vaccine,否则保留Missing
- 原状态为
代码实现
import pandas as pd # 1. 自定义等效疫苗分组映射,可根据实际业务扩展多组等效疫苗 vaccine_equiv_map = { "A": "g1", "B": "g2", "C": "g2" } # 2. 新增辅助列:等效组标识、同组是否有接种记录 df["equiv_group"] = df["疫苗种类"].map(vaccine_equiv_map) df["has_equiv_vaccinated"] = df.groupby(["患者ID", "equiv_group"])["是否已接种"].transform("max") # 3. 批量生成目标状态列 df["desired_status"] = df["当前状态"] update_mask = (df["当前状态"] == "Missing") & (df["has_equiv_vaccinated"] == 1) df.loc[update_mask, "desired_status"] = "Applied equivalent vaccine" # 可选:删除中间辅助列 df.drop(columns=["equiv_group", "has_equiv_vaccinated"], inplace=True)
性能优化提示
- 可提前将「患者ID」「疫苗种类」字段转换为
category类型,可降低30%以上的分组计算耗时,同时减少内存占用 - 若后续数据量超过1000万行,可进一步使用
Dask库并行计算,上述逻辑无需修改即可无缝迁移
内容的提问来源于stack exchange,提问作者Bruno Prates
相关产品推荐
相关产品推荐

