我想為我的貝葉斯網路生成測驗資料。這是我當前的代碼:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df.loc[(df['p_1'] == 1) & (df['p_2'] == 1), 'OP1'] = 1
df.loc[(df['p_1'] == 1) & (df['p_2'] == 0), 'OP2'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 1), 'OP3'] = 1
df.loc[(df['p_1'] == 0) & (df['p_2'] == 0), 'OP4'] = 1
print(df)
所以每次,例如,p_1 有一個 1,p_2 有一個 1,OP1 也應該是 1,所有其他值應該在列中輸出 0。當 p_1 為 1 且 p_2 為 0 時,則 OP2 應為 1,其他所有為 0,依此類推。
但我目前的輸出如下:
| p_1 | p_2 | OP1 | OP2 | OP3 | OP4 | |
|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 | |
| 1 | 0 | 1 | 1 | 1 | 1 | |
| 0 | 0 | 1 | 1 | 0 | 1 | |
| 0 | 1 | 1 | 1 | 1 | 1 | |
| 1 | 0 | 0 | 1 | 1 | 0 |
有什么辦法可以解決嗎?我做錯了什么?
我不太了解其他人問題的解決方案,所以我想我在這里問。
我希望有人能幫助我。
uj5u.com熱心網友回復:
問題是當您實體化時df,“OP”列已經有一些值:
data = np.random.randint(2, size=(5, 6))
columns = ['p_1', 'p_2', 'OP1', 'OP2', 'OP3', 'OP4']
df = pd.DataFrame(data=data, columns=columns)
df
p_1 p_2 OP1 OP2 OP3 OP4
0 1 1 0 1 0 0
1 0 0 1 1 0 1
2 0 1 1 1 0 0
3 1 1 1 1 0 1
4 0 1 1 0 1 0
用您的代碼修復它的一種方法是在之前將所有“OP”列強制為 0:
df["OP1"] = df["OP2"] = df["OP3"] df["OP4"] = 0
但是你會生成太多的亂數。我會這樣做:
data = np.random.randint(2, size=(5, 2))
columns = ['p_1', 'p_2']
df = pd.DataFrame(data=data, columns=columns)
df["OP1"] = ((df['p_1'] == 0) & (df['p_2'] == 1)).astype(int)
uj5u.com熱心網友回復:
您可以定義元組進行測驗并通過將掩碼的值轉換為整數以True/False進行1/0映射來創建新列:
vals = [(1,1),(1,0),(0,1),(0,0)]
for i, (a, b) in enumerate(vals, 1):
df[f'OP{i}'] = ((df['p_1'] == a) & (df['p_2'] == b)).astype(int)
print(df)
p_1 p_2 OP1 OP2 OP3 OP4
0 0 0 0 0 0 1
1 0 1 0 0 1 0
2 0 1 0 0 1 0
3 0 1 0 0 1 0
4 1 0 0 1 0 0
首先在您的解決方案集中0,因為已經1在 original 中設定了值DataFrame:
cols = ['OP1', 'OP2', 'OP3', 'OP4']
df[cols] = 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/453420.html
下一篇:以鍵為索引的字典到資料框
