如何自动对DataFrame切片的rst列做异或运算并写入dr列?
问题场景
有一个名为solve的DataFrame,步长为4的切片结果如下:
rst dr 0 1 0 4 3 0 8 7 0 12 5 0 16 14 0 20 12 0 24 4 0 28 4 0 32 4 0 36 3 0 40 3 0 44 5 0 48 5 0 52 13 0 56 3 0 60 1 0
需要将rst列中步长4切片后的相邻元素进行异或运算(如1^3=2、3^7=4),并将结果写入对应位置的dr列。当前手动截取长度的方法无法适配数据长度变化,需自动化方案;同时需要列间异或的实现策略。
自动化解决方案(切片内相邻元素异或)
无需手动处理长度匹配,利用pandas的shift方法自动对齐相邻元素:
# 提取步长为4的子数据集,避免修改原数据时的链式索引警告 slice_subset = solve[::4].copy() # 计算当前rst与下一个rst的异或,shift(-1)自动获取下一行元素,最后一行无后续元素会生成NaN slice_subset['dr'] = slice_subset['rst'] ^ slice_subset['rst'].shift(-1) # 将计算结果写回原DataFrame,NaN位置填充为0(匹配原数据最后一行dr的默认值) solve.loc[slice_subset.index, 'dr'] = slice_subset['dr'].fillna(0).astype(int)
原理说明
shift(-1)会将rst列整体上移一行,自动实现"当前元素与下一个元素"的配对,无需手动截取数组长度- 通过原切片的索引(
slice_subset.index)直接写回原DataFrame,确保位置完全对应 - 最后一行因无后续元素,异或结果为
NaN,用fillna(0)统一处理为原数据的默认值
列间异或进阶策略
根据不同场景,列间异或可通过以下方式实现:
同一行内两列异或
直接对同行列值进行异或运算,生成新列:# 生成新列,存储col1和col2的异或结果 solve['col_xor'] = solve['col1'] ^ solve['col2']跨列跨行异或
比如某列当前行与另一列下一行的异或,结合shift方法实现:# col1当前行 异或 col2下一行的结果 solve['cross_xor'] = solve['col1'] ^ solve['col2'].shift(-1)分组后列间异或
按指定列分组,组内执行列间异或操作:# 按group_col分组,组内col1与col2的下一行异或 solve['group_xor'] = solve.groupby('group_col').apply( lambda x: x['col1'] ^ x['col2'].shift(-1) ).reset_index(drop=True)
内容的提问来源于stack exchange,提问作者oppressionslayer
相关产品推荐
相关产品推荐

