Pandas如何根据每行Col列取值选取对应列值生成NewCol列
Pandas按行动态取对应列值的高效实现
针对50万行、100列的大规模数据集,禁止使用for循环、iterrows()、apply(axis=1)这类Python层逐行遍历的写法,这类写法性能极差。以下是两种纯向量化的优雅实现,性能比逐行遍历高2~3个数量级:
方法1:NumPy高级索引(全版本兼容,性能最优)
完全在C层执行计算,是目前所有方案里速度最快的,适配所有pandas版本:import numpy as np # 生成行索引,匹配Col列指定列的位置索引 rows = np.arange(len(df)) cols = df.columns.get_indexer(df["Col"]) # 批量取值赋值 df["NewCol"] = df.values[rows, cols]方法2:pandas内置lookup方法(旧版本简洁写法)
如果你使用pandas 1.2.0之前的版本,可以直接调用内置API,写法更简洁,性能和NumPy方案接近:# 注意:pandas 1.2.0及以上版本已标记该方法为弃用,优先使用上面的NumPy方案 df["NewCol"] = df.lookup(df.index, df["Col"])
性能参考:50万行数据规模下,上述两种方案耗时均在10ms级别;逐行循环/
apply方案耗时通常在5~30秒区间,数据量越大性能差距越明显。
原始输入DataFrame结构:
新增NewCol列后的预期效果:
内容的提问来源于stack exchange,提问作者OopsUser
相关产品推荐
相关产品推荐

