def _melt_keep_index(df, value_name="value"):
    """ Fully melt a dataframe keeping index, setting new index as all but `value` """
    id_vars = df.index.names
    return (
        df.reset_index()
        .melt(id_vars=id_vars, value_name=value_name)
        .set_index([*id_vars, df.columns.name])
    )