def read_perseus(path_or_file, **kwargs):
    """
    Read a Perseus-formatted matrix into a pd.DataFrame.
    Annotation rows will be converted into a multi-index.

    By monkey-patching the returned pd.DataFrame a `to_perseus`
    method for exporting the pd.DataFrame is made available.

    :param path_or_file: File path or file-like object
    :param kwargs: Keyword arguments passed as-is to pandas.read_csv
    :returns: The parsed data frame
    """
    annotations = read_annotations(path_or_file, separator)
    column_index = create_column_index(annotations)
    if 'usecols' in kwargs:
	    usecols = kwargs['usecols']
	    if type(usecols[0]) is str:
		    usecols = sorted([list(column_index).index(x) for x in usecols])
	    column_index = column_index[usecols]
    kwargs['dtype'] = dict(kwargs.get('dtype', {}), **annotations.get('dtype', {}))
    kwargs['converters'] = dict(kwargs.get('converters', {}), **annotations.get('converters', {}))
    df = pd.read_csv(path_or_file, sep=separator, comment='#', **kwargs)
    df.columns = column_index
    return df
Read a Perseus-formatted matrix into a pd.DataFrame.
    Annotation rows will be converted into a multi-index.

    By monkey-patching the returned pd.DataFrame a `to_perseus`
    method for exporting the pd.DataFrame is made available.

    :param path_or_file: File path or file-like object
    :param kwargs: Keyword arguments passed as-is to pandas.read_csv
    :returns: The parsed data frame