繁体   English   中英

使用组中的条件创建 random.randint?

[英]Create random.randint with condition in a group by?

我有一个名为“cars”的列,并且想使用我拥有的 random.randint() 创建另一个名为“persons”的列:

dat['persons']=np.random.randint(1,5,len(dat))

这样我就可以输入使用这些的人数,但我想知道如何设置条件,因此在“suv”类别中将仅生成 4 到 9 的数字。

cars | persons
suv     4
sedan   2
truck   2         
suv     1      
suv     5

您可以为您的系列创建一个索引,其中匹配的行具有True ,其他所有元素具有False 然后可以使用loc[]将行分配loc[]该索引匹配的行,以选择行; 然后,您只为这些选定的行生成值的数量:

m = dat['cars'] == 'suv'
dat.loc[m, 'persons'] = np.random.randint(4, 9, m.sum())

您还applycars系列上使用apply来创建新列,在每个调用中创建一个新的随机值:

dat['persons'] = dat.cars.apply(
    lambda c: random.randint(4, 9) if c == 'suv' else random.randint(1, 5))

但这必须为每一行进行单独的函数调用。 使用口罩会更有效。

选项1
因此,您要生成1到5之间的随机数,而SUV类别中的数字应该在4到9之间。这是否意味着您可以生成一个随机数,然后将4加到属于SUV类别的所有随机数上?

df = df.assign(persons=np.random.randint(1,5, len(df)))
df.loc[df.cars == 'suv', 'persons'] += 4

df

    cars  persons
0    suv        7
1  sedan        3
2  truck        1
3    suv        8
4    suv        8

选项2
另一种选择是使用np.where

df.persons = np.where(df.cars == 'suv', 
                      np.random.randint(5, 9, len(df)), 
                      np.random.randint(1, 5, len(df)))
df

    cars  persons
0    suv        8
1  sedan        1
2  truck        2
3    suv        5
4    suv        6

也许有一种方法可以使用比我更聪明的groupby之类的方法来执行此操作,但是我的方法是构建一个函数并将其应用于您的汽车专栏。 这是非常灵活的-如果您希望每辆车都有不同的东西,则可以很容易地以更复杂的逻辑进行构建:

def get_persons(car):
    if car == 'suv':
        return np.random.randint(4, 9)
    else:
        return np.random.randint(1, 5)
dat['persons'] = dat['cars'].apply(get_persons)

或以一种更灵活但不太灵活的方式:

dat['persons'] = dat['cars'].apply(lambda car: np.random.randint(4, 9) if car == 'suv' else np.random.randint(1, 5))

我有一个类似的问题。 我将描述我通常所做的事情,因为应用程序可能会有所不同。 对于较小的框架,这无关紧要,因此上述方法可能适用,但对于像我这样的较大框架(即;数十万到数百万行),我会这样做:

  1. 'cars'排序dat
  2. 获取独特的汽车list
  3. 为随机数创建一个临时list
  4. 遍历该汽车list并填充随机数的临时list并使用临时list扩展新列表
  5. 将新列表添加到'persons'
  6. 如果订单很重要,则按索引维护和重新排序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM