You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pandas DataFrame不同类别生成对应区间的唯一随机数?

解决方案:为不同类别生成区间内的唯一随机数

问题1:为同一类别下的每个条目生成对应区间的唯一随机数

你原来的代码问题在于只生成了单个随机数,然后把这个数复用给整个类别下的所有行。要解决这个问题,我们需要为每个类别的每一行单独生成随机数,而不是用单个值映射。这里推荐两种简洁的实现方式:

方法1:groupby + transform 分组生成

这种方式逻辑清晰,适合类别较多的场景:

import numpy as np
import pandas as pd

# 构造示例DataFrame
data = pd.DataFrame({
    'Category': ['Fish', 'Fish', 'Fish', 'Bird', 'Bird'],
    'Species': ['Trout', 'Pickerel', 'Pike', 'Goose', 'Duck']
})

def generate_group_randoms(group):
    # 根据分组名称(类别)选择对应的区间生成随机数
    if group.name == 'Fish':
        return np.random.randint(5, 45, size=len(group))  # size=分组行数,确保每个条目都有独立随机数
    elif group.name == 'Bird':
        return np.random.randint(55, 95, size=len(group))

# 用transform将结果映射回原DataFrame
data['Random'] = data.groupby('Category')['Category'].transform(generate_group_randoms)

运行后每个类别下的条目都会有不同的随机数,示例输出可能是:

Category  Species  Random
0     Fish    Trout      12
1     Fish  Pickerel      38
2     Fish     Pike      25
3     Bird    Goose      72
4     Bird     Duck      61

方法2:np.where 直接批量生成

如果只有少数类别,用np.where会更简洁:

# 为整个列生成对应区间的随机数
data['Random'] = np.where(
    data['Category'] == 'Fish',
    np.random.randint(5, 45, size=len(data)),
    np.random.randint(55, 95, size=len(data))
)

问题2:针对大数据集避免随机数重复

上面的方法用randint可能会出现重复值,如果需要严格避免同一类别内的随机数重复,可以用np.random.choice并设置replace=False(即无放回抽样)。需要注意的是:你的区间范围必须大于等于该类别的行数,否则会报错(比如Fish类有50条,但区间5-45只有41个不同的数,这时候无法生成50个不重复的数,需要调整区间或者允许重复)。

修改后的实现:

def generate_unique_group_randoms(group):
    if group.name == 'Fish':
        # 生成5到45的所有整数(arange左闭右开,所以取46)
        available_numbers = np.arange(5, 46)
        # 无放回抽样,生成和分组行数一致的不重复随机数
        return np.random.choice(available_numbers, size=len(group), replace=False)
    elif group.name == 'Bird':
        available_numbers = np.arange(55, 96)
        return np.random.choice(available_numbers, size=len(group), replace=False)

data['Unique_Random'] = data.groupby('Category')['Category'].transform(generate_unique_group_randoms)

如果你的数据集某类别的行数超过区间内的数值数量,可以:

  • 扩大随机数区间范围,确保可用数值数量≥行数
  • 去掉replace=False,允许少量重复(适合行数远大于区间的场景)
  • 结合其他逻辑生成不重复数值(比如在基础随机数上添加微小偏移,但要保证不超出区间范围)

内容的提问来源于stack exchange,提问作者McLean Trott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:40:26