如何在pandas DataFrame中基于查找表高效为分组数据添加标量值
解决方案
完全可以用向量化操作实现,性能远高于逐行apply,以下是两种常用的高效实现方式:
前置预处理
首先需要统一处理查找表lookup的position字段格式,原示例中该字段存在字符串类型的数值,需要先转为数值类型:
lookup["position"] = pd.to_numeric(lookup["position"])
方案1:映射法(最简洁,性能最优)
把lookup转为染色体到偏移值的映射字典,直接用map批量匹配偏移值后做向量加法:
# 构建映射字典 offset_map = lookup.set_index("chromosome")["position"].to_dict() # 批量计算新的midpoint df["midpoint"] = (df["midpoint"] + df["chrom"].map(offset_map)).astype(int)
方案2:关联表法(适合需要保留lookup其他字段的场景)
通过左连接把偏移值关联到主表后再计算:
# 左连接关联两个表 df = df.merge(lookup, left_on="chrom", right_on="chromosome", how="left") # 计算midpoint后删除多余字段 df["midpoint"] = (df["midpoint"] + df["position"]).astype(int) df = df.drop(columns=["chromosome", "position"])
两种方案都是纯向量化操作,底层基于numpy优化,不需要逐行遍历,百万级以上数据量的场景下性能比apply高几十到上百倍。
内容的提问来源于stack exchange,提问作者Claudiu Creanga
相关产品推荐
相关产品推荐

