Pretty print with unit and physical suffix
Use better variable naming, with proper vocabulary.  In particular, "significand" is the term to use instead of nx.
You multiplied some intermediate result by 3 to obtain e.  Then you immediately do idx = int(e/3) + …, which represents wasted work.  More importantly, clarity suffers.  I suggest replacing e with power_of_1000 = int(math.floor(math.log10(x) // 3)), whose intent is much clearer.
You can take advantage of the fact that negative indexes count backwards from the end of a list.
There should be a Space in front of each prefix for consistency with the '*10^%d ' format.


import math

def eng_format(x, unit=''):
    # U+03BC is Greek lowercase mu
    UNITS = [' ', ' k', ' M', ' G'] + \
            ([None] * 10) + \
            [' f', ' p', ' n', u' \u03bc', ' m']

    power_of_1000 = int(math.floor(math.log10(x) // 3))
    exponent = 3 * power_of_1000
    prefix = UNITS[power_of_1000]
    if prefix is None:
        prefix = '*10^%d ' % exponent

    significand = x * 10**(-exponent)
    return '%.2f%s%s' % (significand, prefix, unit)