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

时间:2017-12-27 16:57:26

标签: python pandas

我有一个专栏:" cars"并希望创建另一个名为“#34; person"使用random.randint(),我有:

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

这是我可以把使用这些的人数,但我可以 想知道如何在“suv'例如,类别将仅生成4到9之间的数字。

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

3 个答案:

答案 0 :(得分:2)

您可以为系列创建索引,其中匹配的行包含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)

选项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

答案 2 :(得分:0)

可能有一种方法可以通过比我更聪明的群体来做到这一点,但我的方法是建立一个功能并将其应用到你的汽车专栏。这非常灵活 - 如果你想为每辆车提供不同的东西,那么很容易构建更复杂的逻辑:

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))