def lin_norm_row_by_row(data):
    """
    Normalize data with linear algorithm but
    instead to normalize all the matrix, the normalization formula
    (see :func:`normalize`) is applied row by row.
    It ensure that all values are between 0 and 1.

    :param data: the data to normalize, this 2D matrix must contains only coverage scores (no more metadata).
    :type data: a 2D :class:`pandas.DataFrame` object.
    :return: a normalize matrix, where  0 <= zi <=1 where z=(z1, ..., zn)
    :rtype: a 2D :class:`pandas.DataFrame` object or None if data is None.
    """
    if data is None or data.empty:
        return data
    norm_data = data.sub(data.min(axis=1), axis=0)
    amplitude = data.max(axis=1) - data.min(axis=1)
    norm_data = norm_data.div(amplitude, axis=0)
    return norm_data
