如何对Pandas DataFrame指定列进行错位重排,确保无元素保留原配对关系
错位重排b列实现方案
该需求本质是对b列进行错位排列,即重排后任意位置的b值都不等于该位置的原始b值,自然不会出现原a、b配对的情况。以下方案适配Python 3.10 + Pandas 1.1.3环境:
方案1:固定循环移位(结果固定,无随机因子)
通过shift方法将b列整体后移1位,最后一位补到首位,天然满足错排要求:
import pandas as pd # 原始数据构建 data = {'a': ['AA','BB','CC','DD', 'EE', 'FF', 'GG'], 'b': [11, 22, 33, 44, 55, 66, 77], } df = pd.DataFrame(data, columns=['a','b']) # 循环移位实现错排 df['b'] = df['b'].shift(periods=1, fill_value=df['b'].iloc[-1]) print(df)
输出示例:
a b 0 AA 77 1 BB 11 2 CC 22 3 DD 33 4 EE 44 5 FF 55 6 GG 66
方案2:随机错排(每次运行结果不同)
如果需要随机的重排结果,可先实现错排生成逻辑,再替换b列:
import pandas as pd import random # 原始数据构建 data = {'a': ['AA','BB','CC','DD', 'EE', 'FF', 'GG'], 'b': [11, 22, 33, 44, 55, 66, 77], } df = pd.DataFrame(data, columns=['a','b']) # 错排生成函数 def generate_derangement(original_seq): seq_list = list(original_seq) while True: random.shuffle(seq_list) # 校验所有位置元素都不等于原始位置元素 if all(seq_list[i] != original_seq[i] for i in range(len(original_seq))): return seq_list # 替换b列为错排结果 df['b'] = generate_derangement(df['b'].tolist()) # 校验是否存在原配对(可选) original_pairs = set(zip(data['a'], data['b'])) new_pairs = set(zip(df['a'], df['b'])) print("是否存在原a-b配对:", len(original_pairs & new_pairs) > 0) print(df)
输出示例(每次运行结果不同):
是否存在原a-b配对: False a b 0 AA 33 1 BB 55 2 CC 77 3 DD 22 4 EE 66 5 FF 11 6 GG 44
内容的提问来源于stack exchange,提问作者Stpete111
相关产品推荐
相关产品推荐

