You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 06:30:11