You can collect headers and rows in separate data structures and then use csv module to write everything to an excel sheet. Also, the data dict needs to be converted to OrderedDict to maintain order of sequence.
SourceCode
import numpy as np
import csv
from collections import OrderedDict
from itertools import chain
data = {}
testdata = np.array([1,2,3,4,5])
data = OrderedDict(data)
a = {'a': testdata, 'b': testdata, 'c': testdata}
b = {'a2': testdata, 'b2': testdata, 'c2': testdata}
c = {'a3': testdata, 'b3': testdata, 'c3': testdata}
#covert inner dict to OrderedDict
data['set1'] = OrderedDict(sorted(a.items(), key=lambda x:x[0]))
data['set2'] = OrderedDict(sorted(b.items(), key=lambda x:x[0]))
data['set3'] = OrderedDict(sorted(c.items(), key=lambda x:x[0]))
#collect second header
header2 = [data.get(k).keys() for k in data.keys()]
#get number of repetitions for header1
header1_size = len(header2[0])
#get header1
header1 = sorted((data.keys())*header1_size)
#flatten list of list of header2
header2 = list(chain.from_iterable(header2))
#get rows from data dict
rows = zip(*[v2 for k1,v1 in data.items() for k2,v2 in v1.items() ])
#write header1,header2 and rows to excel /csv
with open('csvfile.csv','wb') as ofile:
wr = csv.writer(ofile, dialect='excel')
wr.writerow(header1)
wr.writerow(header2)
wr.writerows(rows)
csvfile

csvmodule? Try some examples, you should be able to figure out.