【问题标题】:TypeError: 'bool' object is not subscriptable with while loopTypeError: 'bool' 对象不能用 while 循环下标
【发布时间】: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


【解决方案1】:

您收到此错误是因为 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]

【讨论】:

    猜你喜欢
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    相关资源
    最近更新 更多