对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
相关产品推荐
相关产品推荐

