DataFrame作为参数传递后无法调用.loc方法的问题排查
问题分析与解决方案
核心错误原因
- 实例方法参数缺失:
_validate_eyes_available是类的实例方法,但定义时未将self作为第一个参数。这会导致调用时传入的data_frame被错误当作self,方法内部实际拿到的不是DataFrame对象,自然没有loc属性。 - 调用参数不匹配:调用
_validate_eyes_available时只传了data_frame,但方法定义需要data_frame和index两个参数,参数缺失引发逻辑混乱。 - 循环删除行的逻辑缺陷:在
for i in range(len(data_frame))循环中直接删除行,会导致DataFrame索引错位,后续循环的i无法对应正确的行。
修正后的代码
def _validate_result_for_attribute(self, result_file, test_summary): data_frame = GazeTest.get_data_frame_from_csv(result_file) # 先收集需要删除的索引,避免循环中删除导致的索引混乱 indices_to_drop = [] for index in data_frame.index: if not self._validate_eyes_available(data_frame, index): indices_to_drop.append(index) # 一次性删除所有目标行 data_frame = data_frame.drop(indices_to_drop) self._update_test_case_fields(data_frame, result_file, test_summary) def _validate_eyes_available(self, data_frame, index): # 检查双眼状态是否可用 if (data_frame.loc[index, RIGHT_EYE_STATUS] == 1 and data_frame.loc[index, LEFT_EYE_STATUS] == 1): return True else: return False
关键修正点
- 给
_validate_eyes_available添加self参数,符合类实例方法的定义规范。 - 调用
_validate_eyes_available时传入index参数,匹配方法的参数要求。 - 改为先收集要删除的索引再一次性删除,避免循环中修改DataFrame导致的索引错位问题。
内容的提问来源于stack exchange,提问作者Eoin O'Reilly
相关产品推荐
相关产品推荐

