while循环打乱多个Pandas DataFrame时报bool对象不可下标访问错误
错误原因
CheckBlockOrder函数的循环逻辑错误:仅检查了第一个两两组合(键1和键2)就直接返回结果,没有遍历所有组合。- 初始状态下8个DataFrame完全一致,第一次调用函数时1和2相等,返回
[pair, False]列表类型,取索引[1]正常运行。 - 你将键1的DataFrame打乱后,第二次调用函数时1和2不再相等,函数直接返回布尔值
True,此时对布尔值执行[1]下标操作就会触发TypeError: 'bool' object is not subscriptable。
- 初始状态下8个DataFrame完全一致,第一次调用函数时1和2相等,返回
- 函数返回值类型不统一:找到重复时返回列表,未找到重复时返回布尔值,也会导致后续取值逻辑报错。
- 逻辑判断不严谨:仅第一个组合不相等不能代表所有DataFrame都无重复,比如2和3仍可能重复,原函数会直接误判为无重复。
修复方案
首先修正CheckBlockOrder函数,统一返回值格式,遍历所有两两组合后再判断是否存在重复:
# 注意不要用dict作为参数名,会覆盖Python内置的dict关键字 def CheckBlockOrder(block_dict): key_list = list(block_dict.keys()) # 遍历所有两两组合 for pair in itertools.combinations(key_list, 2): if block_dict[pair[0]].equals(block_dict[pair[1]]): # 找到重复,返回(重复键对, 是否全部唯一) return pair, False # 所有组合都无重复 return None, True
然后调整while循环逻辑,匹配修正后的返回值:
while True: repeat_pair, is_all_unique = CheckBlockOrder(dictCon) if is_all_unique: break # 打乱重复对第一个键对应的DataFrame,pandas自带sample方法打乱更简洁 df_shuffled = dictCon[repeat_pair[0]].sample(frac=1).reset_index(drop=True) dictCon[repeat_pair[0]] = df_shuffled
内容的提问来源于stack exchange,提问作者Catherine
相关产品推荐
相关产品推荐

