def _extract_multi_indexer_columns(self, header, index_names, col_names,<EOL>passed_names=False):
if len(header) < <NUM_LIT:2>:<EOL><INDENT>return header[<NUM_LIT:0>], index_names, col_names, passed_names<EOL><DEDENT>ic = self.index_col<EOL>if ic is None:<EOL><INDENT>ic = []<EOL><DEDENT>if not isinstance(ic, (list, tuple, np.ndarray)):<EOL><INDENT>ic = [ic]<EOL><DEDENT>sic = set(ic)<EOL>index_names = header.pop(-<NUM_LIT:1>)<EOL>index_names, names, index_col = _clean_index_names(index_names,<EOL>self.index_col,<EOL>self.unnamed_cols)<EOL>field_count = len(header[<NUM_LIT:0>])<EOL>def extract(r):<EOL><INDENT>return tuple(r[i] for i in range(field_count) if i not in sic)<EOL><DEDENT>columns = lzip(*[extract(r) for r in header])<EOL>names = ic + columns<EOL>for n in range(len(columns[<NUM_LIT:0>])):<EOL><INDENT>if all(compat.to_str(c[n]) in self.unnamed_cols for c in columns):<EOL><INDENT>raise ParserError(<EOL>"<STR_LIT>"<EOL>"<STR_LIT>"<EOL>.format(header='<STR_LIT:U+002C>'.join(str(x) for x in self.header))<EOL>)<EOL><DEDENT><DEDENT>if len(ic):<EOL><INDENT>col_names = [r[<NUM_LIT:0>] if (len(r[<NUM_LIT:0>]) and<EOL>r[<NUM_LIT:0>] not in self.unnamed_cols) else None<EOL>for r in header]<EOL><DEDENT>else:<EOL><INDENT>col_names = [None] * len(header)<EOL><DEDENT>passed_names = True<EOL>return names, index_names, col_names, passed_names<EOL>
extract and return the names, index_names, col_names
            header is a list-of-lists returned from the parsers