我想使用 while 回圈對 8 個資料幀的行進行洗牌,直到它們都是相同的資料幀。
這是我的 8 個資料框:
ITI1=3
ITI2=5
ITI3=7
ItiDurations = list(itertools.repeat(ITI1, 6)) list(itertools.repeat(ITI2,4)) list(itertools.repeat(ITI3,2))
def duplicate(testlist, n):
return testlist*n
ValCong=['pos', 'neg']
StimValCong = duplicate(ValCong,6)
ActCong=['go', 'nogo']
ActionCong = duplicate(ActCong,6)
# Congruency list (cong=0, incong=1)
Cong = duplicate([0],12)
Conblock_1 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_2 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_3 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_4 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_5 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_6 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_7 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
Conblock_8 = pd.DataFrame(list(zip(ItiDurations,StimValCong,ActionCong,Cong)),columns=['ITI','StimVal', 'Action', 'Congruency'])
dictCon={1:Conblock_1, 2:Conblock_2, 3:Conblock_3, 4:Conblock_4, 5:Conblock_5, 6:Conblock_6, 7:Conblock_7, 8:Conblock_8}
它們在開始時是相同的。
print(dictCon[1])
ITI StimVal Action Congruency
0 3 pos go 0
1 3 neg nogo 0
2 3 pos go 0
3 3 neg nogo 0
4 3 pos go 0
5 3 neg nogo 0
6 5 pos go 0
7 5 neg nogo 0
8 5 pos go 0
9 5 neg nogo 0
10 7 pos go 0
11 7 neg nogo 0
我首先創建了一個函式,以檢查這 8 個資料幀中是否有相同的資料幀。當有重復時,此函式回傳字典 (dictCon) 和布林值中重復資料幀的配對鍵。但在沒有重復項時回傳布林值 true。
def CheckBlockOrder(dict):
li=[1, 2, 3, 4, 5, 6, 7, 8]
for pair in itertools.combinations(li, 2):
if dict[pair[0]].equals(dict[pair[1]]):
return [pair,False]
else:
return True
然后我使用一個 while 回圈來對資料幀的行進行洗牌,如果有重復的資料幀:
while CheckBlockOrder(dictCon)[1] is not True:
pair=CheckBlockOrder(dictCon)[0]
df_shuffle = dictCon[pair[0]]
df_shuffle = df_shuffle.iloc[np.random.permutation(df_shuffle.index)].reset_index(drop=True)
dictCon.update({pair[0]:df_shuffle})
但是,運行 while 回圈給了我這個錯誤:
while CheckBlockOrder(dictCon)[1] is not True:
TypeError: 'bool' object is not subscriptable
有趣的是,這個錯誤發生在第二次迭代中,而不是第一次。
糾結了很久,沒有解決辦法。有什么建議?謝謝!
uj5u.com熱心網友回復:
您收到此錯誤是因為CheckBlockOrder(dictCon)在某些情況下回傳一個布林值,并且您正試圖獲取無法執行的布林值的第一個位置。
例如:

快速而骯臟的修復:不要只回傳True,請執行以下操作:
def CheckBlockOrder(dict):
li=[1, 2, 3, 4, 5, 6, 7, 8]
for pair in itertools.combinations(li, 2):
if dict[pair[0]].equals(dict[pair[1]]):
return [pair,False]
else:
return [None,True]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/330976.html
上一篇:Python高效/簡單的方法來計算兩個值陣列的總和?
下一篇:控制臺上出現無法追蹤的輸出
