[英]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())
您还apply
在cars
系列上使用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))
我有一个类似的问题。 我将描述我通常所做的事情,因为应用程序可能会有所不同。 对于较小的框架,这无关紧要,因此上述方法可能适用,但对于像我这样的较大框架(即;数十万到数百万行),我会这样做:
'cars'
排序dat
list
list
list
并填充随机数的临时list
并使用临时list
扩展新列表'persons'
列
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.