如何在Python3中压缩两个相同长度的列表,其中第一个具有“无”值?

我遍历Excel表和加载数据到数据框。 这个想法是为当前工作表创build临时数据框,并将其追加到最终的数据框中,在每次迭代之后收集所有数据(包含几张工作表的几个excel文件)。

问题是那些excel工作表的数据行超过100列宽,部分列有多索引(如month> days range),合并单元格中索引较大。

我取消合并的单元格,合并的单元格我正向填充它合并时的值,并且将两个索引级别的值读入两个单独的列表:header_lv1和header_lv2

列表的长度是相同的,但是在索引的顶层创build的索引在excel中只有一个级别的地方有一些“无”的值。

我想用“lv1 – lv2”值将这些列表压缩到一个列表中,以最后一个dataframe列的索引。 现在我有:

header_lv1 = [ws.cell(row=2, column=i).value for i in range(1, sumaInCol + 1)] # read first level of indexes to list header_lv1.extend(['Typ', 'Typ']) # add two more columns header_collection.append(header_lv1) # collect header of each opened sheet for comparison header_lv2 = [ws.cell(row=3, column=i).value for i in range(1, sumaInCol + 1)] # read second level of indexes to list header_lv2.extend(['Produkt', 'MP/H']) # add two more columns header_collection.append(header_lv2) # collect header of each opened sheet for comparison mi = list(zip(header_lv1, header_lv2)) # create list of tuples ind = pd.Index([e[0] + '-' + e[1] for e in mi]) # want to create list with values made by concatenating tuples to string 

header_lv1

[没有,没有,没有,没有,没有,没有,没有,没有,没有,没有,没有,Sierpień,Sierpień,Sierpień,Sierpień,Wrzesień,Wrzesień, Wrzesień','Październik','Październik','Październik','Październik','Październik','Listopad','Listopad','Listopad','Listopad','Grudzień','Grudzień''Grudzień' ,Styczeń,Styczeń,Styczeń,Styczeń,Luty,Luty,Luty,Luty,Marzec,Marzec, Marzec,Kwiecień,Kwiecień,Kwiecień,Maj,Maj,Czerwiec,Czerwiec, Czerwiec,Lipiec,Lipiec,Lipiec,Lipiec,Lipiec,Sierpień,Sierpień,Sierpień,Sierpień,Wrzesień, Wrzesień,Wrzesień,Wrzesień,Październik,Październik,Październik,Październik,Październik,Listopad,Listopad,Listopad,Listopad,Listopad, ,没有,没有,没有,没有,没有,没有,没有,没有,'PODSUMOWANIE W TERMINACH PROMOCJI','PO PUMSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI','PODSUMOWANIE W TERMINACH PROMOCJI',None,None,None,None,None,None,None,None,None,None, '典型','典型']

header_lv2

'Miasto''Kanałkomunikacji''Rodzaj''Typ'Opis / Nazwa'Komunikat'DMS'Rekrutacja'Nowa / -07','08 -14','15-21','22-28','29-04','05 -11','12-18','19-25','26-02 ,'03-09','10-16','17 -23','24 -30','31-06','07-13','14 -20','21-27', '28 -04','05 -11','12-18','19-25','26-01','02-08','09-15','16-22','23 -29','30,05','06-12','13-19','20-26','27-0','06-12','13-19','20-26 ','27 – 02','03 -09','10 -16','17 -23','24 -30','01-07','08 -14','15-21', '22 -28','29 -04','05 -11','12-18','19-25','26-02','03-09','10-16','17 -23','24 -30','31-06','07-13','14 -20','21-27','28-03','04-10','11-17 ','18','24','25','02','08','09','15','16-22','23-29','30-0'','06 -12' '13 -19','20 -26','27-03','liczba emisji','prasa-ilośćmodułów','WARTOŚĆ','cena jednostkowa(brutto)','做września','做października '做'listopada','做grudnia','做09 stycznia','做15 lutego','做11 marca','做29 kwietnia','做31 maja','do 15 lipca','do 10 sierpnia','do 19września','do 30września','po 30września',None,'wartośćkampanii','Status','Wartośćoszczędności',' Rodzajbudżetu','Wycenione','Zamówione','Wysłane','Zrealizowane','开始działania','Realizacjadziałania','Kolejność','ga:campaign','ga:medium','ga:source ','产品','MP / H']

不幸的是,我不知道如何处理元组看起来像(无,“Miasto”)的情况,例如:

ind = pd.Index([e [1] +' – '+ e [0] for e in mi])TypeError:必须是str,而不是NoneType

从python 3.6开始,你可以使用格式化的string,也就是f-string

ind = pd.Index([f"{e[0]} - {e[1]}" for e in mi])

对不起,麻烦了,我已经通过写短的函数来解决这个问题,它改变None为空srting“:

 def checkForNone(list): """Function is changing None values for empty strings""" for i in range(len(list)): if list[i] is None: list[i] = str('') else: continue 

现在只需将该列表传递给该函数,然后将它们转换为元组列表:

 header_lv1 = [ws.cell(row=2, column=i).value for i in range(1, sumaInCol + 1)] header_lv1.extend(['Typ', 'Typ']) header_collection.append(header_lv1) checkForNone(header_lv1) header_lv2 = [ws.cell(row=3, column=i).value for i in range(1, sumaInCol + 1)] header_lv2.extend(['Produkt', 'MP/H']) header_collection.append(header_lv2) checkForNone(header_lv2)