如何用Pandas/Numpy高效实现无循环的逐行异或更新No列
高效实现百万行DataFrame的累积异或更新
问题描述
给定名为ss的Pandas DataFrame(结构如下),需要对第i行(i≥1)的no1-no7列,用该行rst值与前一行的no列对应元素做异或运算,结果替换当前行no列。由于数据量达百万行,需避免低效循环。
rst no1 no2 no3 no4 no5 no6 no7 0 1 6 2 15 14 9 5 1 1 11 0 0 0 0 0 0 0 2 9 0 0 0 0 0 0 0 3 11 0 0 0 0 0 0 0 4 3 0 0 0 0 0 0 0 5 15 0 0 0 0 0 0 0 6 0 0 0 0 0 0 0 0
高效解决方案
利用NumPy的向量化操作和累积异或特性,完全避免Python循环,代码如下:
import numpy as np import pandas as pd # 导入数据(如果已加载可跳过) ss = pd.read_clipboard() # 提取初始no列(第0行)和rst列数组 initial_no = ss.loc[0, 'no1':'no7'].values rst_array = ss['rst'].values # 计算rst列的累积异或:cumulative_rst[i] = rst[0] ^ rst[1] ^ ... ^ rst[i] cumulative_rst = np.bitwise_xor.accumulate(rst_array) # 生成所有行的no列数据:第i行 = 初始no ^ (rst[1]^...^rst[i]) = 初始no ^ (cumulative_rst[i] ^ cumulative_rst[0]) no_columns_data = np.tile(initial_no, (len(ss), 1)) ^ (cumulative_rst[:, np.newaxis] ^ cumulative_rst[0]) # 将结果赋值回DataFrame ss.loc[:, 'no1':'no7'] = no_columns_data
原理说明
异或运算满足结合律,因此连续异或操作可以转化为初始值与累积异或结果的运算:
- 第1行
no= 初始no^ 第1行rst - 第2行
no= 第1行no^ 第2行rst= 初始no^ 第1行rst^ 第2行rst - ...
- 第i行
no= 初始no^ (第1行rst^ 第2行rst^ ... ^ 第i行rst)
通过np.bitwise_xor.accumulate快速计算rst列的累积异或,再利用NumPy广播机制批量完成所有行的异或运算,整个过程是底层C实现的向量化操作,百万行数据处理速度比Python循环快几个数量级。
结果验证
- 第1行计算结果:
[6,2,15,14,9,5,1] ^ 11 = [13,9,4,5,2,14,10],与示例一致 - 第2行计算结果:
[13,9,4,5,2,14,10] ^9 = [4,0,13,12,11,7,3],与示例一致
内容的提问来源于stack exchange,提问作者oppressionslayer
相关产品推荐
相关产品推荐

