【发布时间】:2021-12-08 16:15:38
【问题描述】:
我想使用 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
有趣的是,这个错误发生在第二次迭代,而不是第一次。
我已经bug了很久,没有解决办法。有什么建议?谢谢!
【问题讨论】:
-
通常您会返回一个元组而不是一个列表,并且您会将“通用”返回值(在您的情况下为布尔值)作为元组中的第一项。例如:分别为
return (False, pair)和return (True,)。
标签: python python-3.x pandas dataframe dictionary