def labelwell(platemap, labelby, iterrange, **kwargs):
    """Returns label for each row of a stipulated column.
    
    Used to return the appropriate, formatted label from a specified platemap at every well. Empty wells will always return 'empty', wells without a label will return a blank string.  
    
    :param platemap: Platemap that contains the required labels
    :type platemap: pandas dataframe
    :param labelby: Dataframe column to label by, for example 'Compound', 'Protein', 'Concentration', 'Concentration Units', 'Contents' or 'Type'
    :type labelby: str
    :param iterrange: Number of instances to itterate over, typically the size of the platemap
    :type iterrange: int
    :param **kwargs: The str_format (str) is accepted as a keyword argument, it determines whether the value is to be displayed in scientific notation or percentage 1 d.p.
    :return: string corresponding to the value located in column labelby and row iterrange of the platemap
    :rtype: str
    """
    if 'str_format' in kwargs and kwargs['str_format'] == 'scinot':   # if scinot parameter is true, format the value in scientific notation 
        return "%.2E" % (platemap[labelby].iloc[iterrange])
    elif 'str_format' in kwargs and kwargs['str_format'] == 'percent':
        return "%.1f" % (platemap[labelby].iloc[iterrange])
    else:   # get the value from 'labelby' column and 'iterrange' row
        return str(platemap[labelby].iloc[iterrange]).replace(" ", "\n")