使用Faker生成带唯一ID前缀数据集:错误修复及唯一性问询
生成唯一6位ID数据集的问题与优化方案
我尝试创建包含唯一6位ID(格式如ID123456)的数据集,最初在第8行遇到错误:
ValueError: not enough values to unpack (expected 6, got 5)
现已修复该错误及ID前缀拼接问题,当前需确保生成的ID在拟生成的1000行数据中唯一,当前使用的代码如下:
from faker import Faker import random import pandas as pd Faker.seed(0) random.seed(0) fake = Faker("en_US") fixed_digits = 6 concatid = 'ID' idcode,name, city, country, job, age = [[] for k in range(0,6)] for row in range(0,100): idcode.append(concatid + str(random.randrange(111111, 999999, fixed_digits))) name.append(fake.name()) city.append(fake.city()) country.append(fake.country()) job.append(fake.job()) age.append(random.randint(20,100)) d = {"ID Code":idcode, "Name":name, "Age":age, "City":city, "Country":country, "Job":job} df = pd.DataFrame(d) df.head()
原代码问题分析
原代码用random.randrange(111111, 999999, fixed_digits)生成ID数字部分,步长设为6会导致生成的数字是固定间隔的序列,随机选择时极易出现重复,无法保证1000行ID的唯一性。
优化方案
方案1:生成不重复随机ID
通过random.sample直接从6位数字范围内挑选1000个不重复值,再拼接前缀,确保ID唯一:
from faker import Faker import random import pandas as pd Faker.seed(0) random.seed(0) fake = Faker("en_US") concatid = 'ID' # 生成1000个不重复的6位随机数,范围包含所有6位数字 unique_numbers = random.sample(range(100000, 1000000), 1000) idcode = [concatid + str(num) for num in unique_numbers] # 批量生成其他字段数据 name = [fake.name() for _ in range(1000)] city = [fake.city() for _ in range(1000)] country = [fake.country() for _ in range(1000)] job = [fake.job() for _ in range(1000)] age = [random.randint(20, 100) for _ in range(1000)] # 构建DataFrame d = {"ID Code":idcode, "Name":name, "Age":age, "City":city, "Country":country, "Job":job} df = pd.DataFrame(d) # 验证唯一性(可选) print(df["ID Code"].nunique() == 1000) # 输出True则表示所有ID唯一
方案2:自增式ID(适合无需强随机的场景)
如果不需要完全随机的ID,自增方式更高效,且天然保证唯一:
from faker import Faker import random import pandas as pd Faker.seed(0) random.seed(0) fake = Faker("en_US") concatid = 'ID' # 生成自增6位ID,用0补全前导位确保格式统一 idcode = [concatid + f"{i:06d}" for i in range(1, 1001)] # 批量生成其他字段数据 name = [fake.name() for _ in range(1000)] city = [fake.city() for _ in range(1000)] country = [fake.country() for _ in range(1000)] job = [fake.job() for _ in range(1000)] age = [random.randint(20, 100) for _ in range(1000)] # 构建DataFrame d = {"ID Code":idcode, "Name":name, "Age":age, "City":city, "Country":country, "Job":job} df = pd.DataFrame(d)
内容的提问来源于stack exchange,提问作者k1dr0ck
相关产品推荐
相关产品推荐

