Python中忽略NaN值将SCORE列与多个S开头列相加的高效实现
解决方案
直接使用pandas原生向量化运算即可实现需求,无Python层面的循环逻辑,完全适配大数据量场景:
核心逻辑
pandas的add方法自带空值兼容特性:非NaN值会正常执行加法,NaN值参与运算后仍保留为NaN,配合DataFrame的广播机制可以直接逐行完成所有S列和SCORE列的批量相加。
完整实现代码
import pandas as pd import numpy as np # 示例数据构造 data_ex = [ [1,1,38147,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [2,1,567,38147, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [3,1,0,567,38147, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [4,1,0,0,567,38147, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [5,1,0,0,0,567,38147, np.NaN,np.NaN,np.NaN,np.NaN], [6,1,0,0,0,0,567,38147, np.NaN,np.NaN,np.NaN], [7,1,0,0,0,0,0,567,38147, np.NaN,np.NaN], [8,1,586,0,0,0,0,0,567,38147, np.NaN], [1,2,3099,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [2,2,30460,3099,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [3,2,2372,30460,3099,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN], [4,2,0,2372,30460,3099,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN ], [5,2,0,0,2372,30460,3099,np.NaN,np.NaN,np.NaN,np.NaN,], [6,2,0,0,0,2372,30460,3099,np.NaN,np.NaN,np.NaN], [7,2,0,0,0,0,2372,30460,3099,np.NaN,np.NaN], [8,2,267,0,0,0,0,2372,30460,3099,np.NaN], ] test_data = pd.DataFrame(data_ex, columns = ['FIRST', 'SECOND', 'SCORE', 'S1', 'S2', 'S3', 'S4', 'S5', 'S6', 'S7', 'S8']) repeat = 8 # 生成需要操作的S列列表 s_cols = [f'S{i}' for i in range(1, repeat+1)] # 向量化执行加法 test_data[s_cols] = test_data[s_cols].add(test_data['SCORE'], axis=0) # 输出验证 print(test_data)
性能说明
该实现完全基于pandas底层C语言实现的向量化运算,没有Python层面的遍历逻辑,处理百万级以上行数的数据集时性能是普通for循环的百倍以上,完全满足大数据量场景需求。
内容的提问来源于stack exchange,提问作者Deb
相关产品推荐
相关产品推荐

