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

对Pandas DataFrame按ID分组后实现col3列一致性随机重排

问题描述

原始DataFrame结构如下:

ID  col2    col3
1   101001  a
1   101001  b
1   101001  c
1   101002  a
1   101002  b
1   101002  c
1   101003  a
1   101003  b
1   101003  c
1   101004  a
1   101004  b
1   101004  c
2   101001  a
2   101001  b
2   101001  d
2   101002  a
2   101002  b
2   101002  d
2   101003  a
2   101003  b
2   101003  d
2   101004  a
2   101004  b
2   101004  d
3   101001  b
3   101001  c
3   101001  d
3   101002  b
3   101002  c
3   101002  d
3   101003  b
3   101003  c
3   101003  d
3   101004  b
3   101004  c
3   101004  d

需要实现的效果:

  • 按ID分组,对每个ID对应的col3条目做随机重排,结果写入新列col4
  • 同一ID的重排规则必须一致,不受col2影响。比如ID=1时,col3里的a重排后始终是b,所有a都对应b,示例结果如下:
ID  col2    col3    col4
1   101001  a   b
1   101001  b   a
1   101001  c   c
1   101002  a   b
1   101002  b   a
1   101002  c   c
1   101003  a   b
1   101003  b   a
1   101003  c   c
1   101004  a   b
1   101004  b   a
1   101004  c   c
2   101001  a   d
2   101001  b   a
2   101001  d   b
2   101002  a   d
2   101002  b   a
2   101002  d   b
2   101003  a   d
2   101003  b   a
2   101003  d   b
2   101004  a   d
2   101004  b   a
2   101004  d   b
3   101001  b   b
3   101001  c   d
3   101001  d   c
3   101002  b   b
3   101002  c   d
3   101002  d   c
3   101003  b   b
3   101003  c   d
3   101003  d   c
3   101004  b   b
3   101004  c   d
3   101004  d   c

之前尝试的方法df['col4'] = test_df.groupby('ID')['col3'].transform(np.random.permutation)无法满足需求,因为同一ID内不同col2分组的重排结果不一致,不符合规则统一的要求。

解决方案

核心思路是为每个ID生成固定的映射字典:先获取每个ID对应的col3唯一值,对这些唯一值做随机重排,建立原值到重排后值的映射,再用这个映射去替换整个ID下的所有col3值。

具体代码实现:

import pandas as pd
import numpy as np

# 构造原始DataFrame
test_df = pd.DataFrame({
    'ID': [1]*12 + [2]*12 + [3]*12,
    'col2': [101001,101001,101001,101002,101002,101002,101003,101003,101003,101004,101004,101004]*3,
    'col3': ['a','b','c']*4 + ['a','b','d']*4 + ['b','c','d']*4
})

# 生成每个ID的col3映射关系
def create_mapping(group):
    unique_vals = group['col3'].unique()
    shuffled_vals = np.random.permutation(unique_vals)
    return pd.Series(shuffled_vals, index=unique_vals)

# 按ID分组生成映射,合并到原数据
mappings = test_df.groupby('ID').apply(create_mapping).reset_index().rename(columns={'level_1':'col3', 0:'col4'})
test_df = test_df.merge(mappings, on=['ID','col3'], how='left')

print(test_df)

代码说明

  • create_mapping函数:对每个ID分组,提取col3的唯一值,随机打乱后建立原值到新值的映射。
  • 将映射结果合并回原DataFrame,通过ID和col3匹配,确保同一ID下相同的col3值对应唯一的col4值,完全符合规则统一的要求。

内容的提问来源于stack exchange,提问作者Palilicium

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 03:15:36