[英]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.