如何为Pandas DataFrame的ProductID列批量生成唯一随机字母数字组合?
批量生成DataFrame唯一随机ProductID的解决方案
问题根源
你之前的循环代码存在两个核心问题:
- 赋值逻辑错误:
df3['ProductID'] = id_generator()是对整个列进行赋值,每次循环都会把所有行的ProductID替换为新生成的单个ID,最终全列都是最后一次循环生成的结果。 - 效率极低:
iterrows()逐行遍历50万行DataFrame的速度极慢,完全不适合这类批量操作。
高效解决方案(推荐)
直接批量生成与DataFrame行数匹配的随机ID列表,一次性赋值给列,这是速度最快的处理方式。
步骤1:优化随机ID生成函数
用random.choices替代循环调用random.choice,大幅提升单个ID的生成效率:
import string import random import pandas as pd def id_generator(size=12, chars=string.ascii_uppercase + string.digits): # 一次性选取size个字符,比循环choice效率更高 return ''.join(random.choices(chars, k=size))
步骤2:批量生成并赋值
# 生成对应行数的随机ID列表 id_list = [id_generator() for _ in range(len(df3))] # 直接赋值给ProductID列 df3['ProductID'] = id_list
可选:确保ID绝对唯一
12位大写字母+数字的组合共有约4.7×10¹⁸种可能,50万行数据的重复概率几乎为0。如果业务要求绝对无重复,可通过集合去重:
required_count = len(df3) id_set = set() while len(id_set) < required_count: id_set.add(id_generator()) # 转换为列表后赋值 df3['ProductID'] = list(id_set)
其他方案(不推荐)
pandas apply方法
本质仍是逐行处理,效率远低于批量生成:
df3['ProductID'] = df3.apply(lambda _: id_generator(), axis=1)
修正后的循环(仅作原理演示)
如果要理解逐行赋值的逻辑,可修改循环代码,但禁止用于50万行数据(速度极慢):
for index, row in df3.iterrows(): df3.loc[index, 'ProductID'] = id_generator()
内容的提问来源于stack exchange,提问作者Dolunaykiz
相关产品推荐
相关产品推荐

