![](/img/trans.png)
[英]How to assign random values from a list to a column in a pandas dataframe?
[英]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])
獲得全套。
這是個主意。 您可以將GroupBy
與np.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.