簡體   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