簡體   English   中英

按組按比例在pandas列中分配隨機值

[英]Assign random values in a pandas column proportionately by group

像這樣的df數據框:

ID   Category   Result
1     A          ...
2     B          ...
3     B          ...
4     C          ...

無論類別是A,在其中,給定每種結果類型的比例分別為30,40,30的情況下,以隨機順序分配三個結果(Pass,Fail,Hold)值。 對於具有不同比例的其他類別也是如此。 有什么快速的方法嗎?

目前我正在使用

np.split(df[cond],int([.3*len(df[cond])]),int([.7*len(df[cond])]))

將數據分成比例,然后

df1[Result] = 'Pass'
df2[Result] = 'Fail'...
pd.concat([df1,df2,...all conditioned columns frames])

獲得全套。

這是個主意。 您可以將GroupBynp.random.choice使用。

這不能保證您的比例保持不變。 例如,如果特定類別只有一行,那么如果您的權重全都不為零,則不能保證保留比例。 即使可以保留它們,邏輯仍然使用“隨機”數字來選擇每個值。 使用這種方法,您可以說的是,隨着行數趨於無窮大,比率將趨向於所提供的權重。

values = ['Pass', 'Fail', 'Hold']
weights = {'A': [0.3, 0.4, 0.3], 'B': [0.6, 0.2, 0.2]}

df = pd.DataFrame({'Category': list('A'*10 + 'B'*5)})

np.random.seed(0)

def apply_randoms(x):
    key = x['Category'].iat[0]
    return pd.Series(np.random.choice(values, size=len(x), p=weights[key]))

df = df.groupby('Category').apply(apply_randoms)\
       .rename('Result').reset_index().drop('level_1', 1)

print(df)

   Category Result
0         A   Hold
1         A   Fail
2         A   Fail
3         A   Hold
4         A   Pass
5         A   Pass
6         A   Pass
7         A   Hold
8         A   Hold
9         A   Hold
10        B   Hold
11        B   Fail
12        B   Pass
13        B   Fail
14        B   Pass

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM