我有一个名为“cars”的列,并希望使用random.randint()创建另一个名为“people”的人,我有:
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[]
分配与该索引匹配的行以选择行;然后,您只生成所选行的值的数量:
m = dat['cars'] == 'suv'
dat.loc[m, 'persons'] = np.random.randint(4, 9, m.sum())
您还可以在apply
系列上使用cars
来创建新列,在每次调用中创建一个新的随机值:
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
可能有一种方法可以通过比我更聪明的组合来做到这一点,但我的方法是构建一个函数并将其应用到您的汽车列。这非常灵活 - 如果你想为每辆车提供不同的东西,那么很容易构建更复杂的逻辑:
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))