def ic_to_soil_type(df):
    """
    Assign the soil type to the corresponding Ic.

    :param df: (DataFrame) Original DataFrame.
    :return: (DataFrame) Updated DataFrame.
    """
    df = df.assign(soil_type='')
    ic_mask = df['type_index'].values > 3.6
    df.loc[ic_mask, 'soil_type'] = 'Peat'
    ic_mask = df['type_index'].values <= 3.6
    df.loc[ic_mask, 'soil_type'] = 'Clays - silty clay to clay'
    ic_mask = df['type_index'].values <= 2.95
    df.loc[ic_mask, 'soil_type'] = 'Silt mixtures - clayey silt to silty clay'
    ic_mask = df['type_index'].values <= 2.6
    df.loc[ic_mask, 'soil_type'] = 'Sand mixtures - silty sand to sandy silt'
    ic_mask = df['type_index'].values <= 2.05
    df.loc[ic_mask, 'soil_type'] = 'Sands - clean sand to silty sand'
    ic_mask = df['type_index'].values <= 1.31
    df.loc[ic_mask, 'soil_type'] = 'Gravelly sand to dense sand'
    return df
