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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 11:06:02