如何在pandas列值重映射时从指定列表随机抽取对应结果
pandas单列数值带随机规则的重映射方法
错误原因
你之前的写法出错是因为构造映射字典时,random.choice(choice_list)仅执行1次,字典中键2对应的是单次执行得到的固定结果,后续调用map或replace时,所有值为2的行都会匹配这个固定值,无法实现逐行随机。
推荐解决方案
方案1:向量化操作(适合大数据量,性能更高)
优先用numpy向量化随机实现,比逐行操作效率高很多:
import pandas as pd import numpy as np # 示例数据 df = pd.DataFrame({"col1": [1, 2, 3, 4, 5, 6, 7, 8], "col2": [2, 2, 2, 3, 1, 2, 2, 1]}) # 先处理固定映射规则 df['remap'] = df['col2'].map({1: 'a', 3: 'd'}) # 筛选出需要随机映射的行,逐行随机赋值 mask = df['col2'] == 2 df.loc[mask, 'remap'] = np.random.choice(['b', 'c'], size=mask.sum())
方案2:自定义映射函数(适合规则复杂的场景)
如果有多个需要随机映射的取值,自定义函数配合apply可读性更强:
import pandas as pd import random # 示例数据 df = pd.DataFrame({"col1": [1, 2, 3, 4, 5, 6, 7, 8], "col2": [2, 2, 2, 3, 1, 2, 2, 1]}) def custom_remap(val): if val == 1: return 'a' elif val == 2: return random.choice(['b', 'c']) elif val == 3: return 'd' # 其他值可按需返回原值/NaN等 return pd.NA df['remap'] = df['col2'].apply(custom_remap)
调试提示
如果需要固定随机结果方便复现,可以在执行随机操作前设置随机种子:
# 配合方案1使用 np.random.seed(123) # 配合方案2使用 random.seed(123)
内容的提问来源于stack exchange,提问作者Saaru Lindestøkke
相关产品推荐
相关产品推荐

