{"record":{"id":"0d9174b983c77610","repo":"keras-team/keras","slug":"expect-string-list-or-tuple-but-found-in-co","errorCode":null,"errorMessage":"Expect string, list or tuple but found {} in {} column ","messagePattern":"Expect string, list or tuple but found (.+?) in (.+?) column ","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"keras/src/legacy/preprocessing/image.py","lineNumber":882,"sourceCode":"        for label in df[y_col]:\n            if isinstance(label, (list, tuple)):\n                labels.append([self.class_indices[lbl] for lbl in label])\n            else:\n                labels.append(self.class_indices[label])\n        return labels\n\n    @staticmethod\n    def _filter_classes(df, y_col, classes):\n        df = df.copy()\n\n        def remove_classes(labels, classes):\n            if isinstance(labels, (list, tuple)):\n                labels = [cls for cls in labels if cls in classes]\n                return labels or None\n            elif isinstance(labels, str):\n                return labels if labels in classes else None\n            else:\n                raise TypeError(\n                    \"Expect string, list or tuple \"\n                    \"but found {} in {} column \".format(type(labels), y_col)\n                )\n\n        if classes:\n            # prepare for membership lookup\n            classes = list(collections.OrderedDict.fromkeys(classes).keys())\n            df[y_col] = df[y_col].apply(lambda x: remove_classes(x, classes))\n        else:\n            classes = set()\n            for v in df[y_col]:\n                if isinstance(v, (list, tuple)):\n                    classes.update(v)\n                else:\n                    classes.add(v)\n            classes = sorted(classes)\n        return df.dropna(subset=[y_col]), classes\n","sourceCodeStart":864,"sourceCodeEnd":900,"githubUrl":"https://github.com/keras-team/keras/blob/7a34a03db60bf60042242d6a556fc3be119046a5/keras/src/legacy/preprocessing/image.py#L864-L900","documentation":"When filtering classes (classes=... argument), each y_col value must be a string, list, or tuple so membership in the class set can be tested. Any other Python type raises TypeError.","triggerScenarios":"flow_from_dataframe(..., classes=[...]) with numeric or NaN label values in y_col.","commonSituations":"Passing classes for the first time after previously running with numeric labels.","solutions":["Make all y_col values strings (or lists of strings)","Convert numerics: df[y_col] = df[y_col].astype(str)"],"exampleFix":"// before\nclasses=['0','1']; df['label'] numeric\n// after\ndf['label'] = df['label'].astype(str)\n","handlingStrategy":"type-guard","validationCode":"assert df[y_col].map(lambda v: isinstance(v, (str, list, tuple))).all()","typeGuard":"def label_ok(v): return isinstance(v, (str, list, tuple))","tryCatchPattern":"try: flow_from_dataframe(..., classes=classes)\nexcept TypeError as e: if 'Expect string, list or tuple' in str(e): df[y_col] = df[y_col].astype(str)","preventionTips":["Keep label columns string-typed whenever classes= is used"],"tags":["keras","dataframe","type-validation"],"backgroundTag":"invalid-argument-type","analyzedSha":"7a34a03db60bf60042242d6a556fc3be119046a5","analyzedAt":"2026-08-25T21:25:25.994Z","schemaVersion":2},"datasetVersion":"2026-08-26T02:17:13.382Z"}