如何随机打乱pandas DataFrame列并保证重复姓名组映射相同新值
实现方案
核心思路是先给每个独立用户(Name+surname唯一组合)预分配打乱后的新名称,再批量映射回原数据集,保证同一用户的所有记录新名称完全一致。
完整实现代码
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'Name': ['John', 'Arthur', 'Arthur', 'Mike'], 'surname': ['Bisham', 'Lefer', 'Lefer', 'Loner'] }) # 步骤1:提取所有唯一用户,生成用户到新名称的映射 unique_users = df[['Name', 'surname']].drop_duplicates() # 步骤2:打乱原Name列的唯一值作为新名称池,保证和原唯一用户数量一致 shuffled_names = np.random.permutation(df['Name'].unique()) # 步骤3:建立唯一用户和新名称的映射关系 user_map = unique_users.assign(new_name=shuffled_names).set_index(['Name', 'surname'])['new_name'] # 步骤4:映射回原DataFrame df['new name'] = df.set_index(['Name', 'surname']).index.map(user_map) print(df)
输出示例(每次运行new name列会随机变化,同一用户新名称保持一致)
Name surname new name 0 John Bisham Mike 1 Arthur Lefer John 2 Arthur Lefer John 3 Mike Loner Arthur
如果需要用和原Name完全不重名的自定义新名称,只需要把shuffled_names替换成你自定义的名称列表即可,示例如下:
# 自定义新名称列表,长度需要和唯一用户数量一致 custom_names = ['Rick', 'Mark', 'Peter'] user_map = unique_users.assign(new_name=custom_names).set_index(['Name', 'surname'])['new_name']
运行后即可得到和你给出的示例完全一致的输出效果。
内容的提问来源于stack exchange,提问作者istwine
相关产品推荐
相关产品推荐

