用Python映射Excel数据

1 投票
2 回答
3538 浏览
提问于 2025-04-17 06:27

我正在使用xlrd从一个xls电子表格中读取数据。首先,我需要找到包含我所需数据的那一列的索引(因为在不同的情况下,这一列可能不总是相同的):

amr_list, pssr_list, inservice_list = [], [], []
for i in range(sh.ncols):
    for j in range(sh.nrows):
        if 'amrprojectnumber' in sh.cell_value(j,i).lower():
            amr_list.append(sh.cell_value(j,i))
        if 'pssrnumber' in sh.cell_value(j,i).lower():
            pssr_list.append(sh.cell_value(j,i))
        if 'inservicedate' in sh.cell_value(j,i).lower():
            inservice_list.append(sh.cell_value(j,i))

现在我有了三个列表,我需要用它们来写入一个新的工作簿。每一行中的值是相关的,也就是说,一个列表中某个项目的索引和其他列表中对应项目的索引是一样的。

amr_list中有重复的字符串值。例如:

['4006BA','4006BA','4007AC','4007AC','4007AC']

pssr_list中的值总是和amr_list中的值相同,但会有额外的信息:

['4006BA(1)','4006BA(2)','4007AC(1)','4007AC(2)','4007AC(3)']

最后,inservice_list中可能包含一个可变的日期(这是从excel中读取的):

[40780.0, '', 40749.0, 40764.0, '']

这是我想从数据中得到的结果:

amr = { '4006BA':[('4006BA(1)',40780.0),('4006BA(2)','')], '4007AC':[('4007AC(1)',40749.0),('4007AC(2)',40764.0),('4007AC(3)','')] }

但是我很难找到一个简单的方法来实现这个目标。提前谢谢大家。

2 个回答

2

也许这个可以帮到你:

A = ['4006BA','4006BA','4007AC','4007AC','4007AC']
B = ['4006BA(1)','4006BA(2)','4007AC(1)','4007AC(2)','4007AC(3)']
C = [40780.0, '', 40749.0, 40764.0, '']

result = dict()
for item in xrange(len(A)):
    key = A[item]
    result.setdefault(key, [])
    result[key].append( (B[item], C[item] ) )

print result

这段代码会以你想要的格式打印出数据。

1

可以看看 itertools.groupby 这个工具,

zip(amr_list, pssr_list, inservice_list)

针对你的情况:

dict((x,list(a[1:] for a in y)) for x,y in
    itertools.groupby(zip(amr_list, pssr_list, inservice_list), lambda z: z[0]))

注意,这个方法假设你的输入数据是按照 amr_list 排序的。

另外一种方法是:

combined={}
for k, v in zip(amr_list, zip(pssr_list, inservice_list)):
    combined.setdefault(k, []).append(v)

这种方法不需要你的输入数据是排序的。

撰写回答