Grouping the results in an array having same name
General comments

results = sorted(results, key=lambda datum: datum['car_model'])


Good use of sorted!

#removing the car type if car model exists.
d = defaultdict(dict)
for l in results:
    d[l['name']+'-'+l['work_type']] = l

results = d.values()


Why are you using a defaultdict? A normal dict suffices.

#grouping the results at panel level.
d = defaultdict(dict)
for l in results:
    d.setdefault(l['name'],[]).append(l)


Again, why a defaultdict, a normal dict suffices.

#creating dict such that panel name is key and price_list is array of all the panel prices.
output = []
for key,value in d.iteritems():
    output.append({"name":key,"price_list":value})


Good enough, I suppose. Alternatively, use

output = [{"name": key, "price_list": value} for key, value in d.iteritems()]


Variable naming

Variable names such as d and l just don't cut it anymore. Please use descriptive variable names.

Revised code

results = sorted(results, key=lambda datum: datum['car_model'])

# Make sure results are unique by {name}-{work_type}
results = {l['name'] + '-' + l['work_type']: l for l in results}.values()

# Grouping the results at panel level.
d = {}
for l in results:
    d.setdefault(l['name'],[]).append(l)

# Creating dict such that panel name is key and price_list is array of all the panel prices.
output = [{"name": key, "price_list": value} for key, value in d.iteritems()]


Separate by functions

I see several actions: getting unique values, grouping by a key, and finally outputting it.

Getting unique values

def unique_by(lst, key=lambda x: x):
    return {key(v): v for v in lst}.values()


You can call it like

results = unique_by(results, key=lambda l: l['name'] + '-' + l['work_type'])


or better

results = unique_by(results, key=lambda l: (l['name'], l['work_type']))


and using operator.itemgetter:

results = unique_by(results, key=itemgetter('name', 'work_type'))


Grouping by a key

def group_by(lst, key=None):
    assert key is not None, 'You must supply a key function'
    retval = {}
    for v in lst:
        retval.setdefault(key(v), []).append(v)
    return retval


You can call it like

grouped = group_by(results, key=lambda l: l['name'])


or

grouped = group_by(results, key=itemgetter('name'))


Revised, again

from operator import itemgetter

results = sorted(results, key=itemgetter('car_model'))
results = unique_by(results, key=itemgetter('name', 'work_type'))
grouped = group_by(results, key=itemgetter('name'))
output = [{"name": name, "price_list": items} for name, items in grouped.iteritems()]


(where unique_by and group_by are defined as above.)

Note: untested, but it should work (modulo syntax errors).