Как сжать два списка одинаковой длины, где первый имеет значения «Нет», в Python3?

Я перебираю листы Excel и загружаю данные в фрейм данных. Идея заключалась в том, чтобы создать временный фрейм данных для текущего листа и добавить его к окончательному фрейму данных, который собирает все данные после каждой итерации (несколько файлов Excel с несколькими листами внутри).

Дело в том, что эти листы Excel имеют строки данных шириной более 100 столбцов, а часть столбцов имеет мультииндексы (например, диапазоны месяцев> дней) с верхним индексом в объединенных ячейках.

Я разъединяю ячейки, для ячеек, которые были объединены, я заполняю значение, которое оно имело при объединении, и я читаю значения обоих уровней индексов в два отдельных списка: header_lv1 и header_lv2.

Списки имеют одинаковую длину, но тот, который создан из верхнего уровня индекса, имеет некоторые значения «Нет» в местах, где индекс был только одним уровнем в Excel.

Я хочу объединить эти списки в один список со значениями "lv1 - lv2", чтобы получить индекс одного уровня для столбцов фрейма данных. На данный момент у меня есть:

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

[Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, "Серпень", "Серпень", "Серпень", "Серпень", "Вжесен", "Вжесен", "Вжесен", " Вжесень», «Паздзерник», «Паждзерник», «Паждзерник», «Паждзерник», «Паждзерник», «Листопад», «Листопад», «Листопад», «Листопад», «Грудзень», «Грудзень», «Грудзень» , 'Грудзень', 'Стычень', 'Стычень', 'Стычень', 'Стычень', 'Стычень', 'Люты', 'Люти', 'Люти', 'Люти', 'Маржец', 'Маржец', ' Маржец», «Маржец», «Квецень», «Квецень», «Квецень», «Квецень», «Квецень», «Май», «Май», «Май», «Май», «Червец», «Червец» , 'Червец', 'Червец', 'Липец', 'Липец', 'Липец', 'Липец', 'Липец', 'Серпень', 'Серпень', 'Серпень', 'Серпень', 'Вжесень', ' Вжесень, 'Вжесень', 'Вжесень', 'Паждиерник', 'Пажудерник', 'Пажудерник', 'Пажудерник', 'Пажудерник', 'Листопад', 'Листопад', 'Листопад', 'Листопад', 'Листопад' , Нет, Нет, Нет, Нет, Нет, Нет, Нет, Нет, 'ПОДАВЛЕНИЕ С ТЕРМИНАХ ПРОМОЦИИ', 'ПОДАВЛЕНИЕ С ТЕРМИНАХ ПРОМОКСИ', 'ПОДСУ Mowanie w Terminach Promocji ',' Podsumowanie w Terminach Promocji ',' Podsumowanie w Terminach Promocji ',' Podsumowanie w Terminach Promocji ', Podsumowanie w Terminach Promocji', Podsumowanie w terminach, Podinachie ', Podinachie', Podinachie ', Podinachie', Podinachie ', Podinachie', Podinachie ', Podinachie', PodiNaNah -wom W TERMINACH PROMOCJI', None, None, None, None, None, 'wyc', 'zam', 'wys', 'zre', None, None, None, None, None, None, 'Typ', 'Typ' ]

header_lv2

['Miasto', 'Kanał komunikacji', 'Rodzaj', 'Typ', 'Opis/Nazwa', 'Komunikat', 'DMS', 'Rekrutacja', 'Nowa/stara oferta', 'Osoba odpowiedzialna', '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-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-05", "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-01', '02-08', '09-15', '16-22', '23-29', '30-05', '06-12', '13-19', '20-26', '27-03', 'liczba emisji', 'prasa - ilość modułów', 'WARTOŚĆ', 'cena jednostkowa(brutto)', 'do września', 'do października ', 'до листопада', 'до грудня', 'до 09 стичня', 'до 15 lutego', 'до 11 марта', 'до 29 квиетния', 'до 31 мая', ' до 15 дней», «до 10 месяцев», «до 19 дней», «до 30 дней», «по 30 дней», «Нет», «Военные кампании», «Статус», «Вартосць ощендности», «Родзай буджету», 'Wycenione', 'Zamówione', 'Wysłane', 'Zrealizowane', 'Start działania', 'Realizacja działania', 'Kolejność', 'ga:campaign', 'ga:medium', 'ga:source', 'Produkt ', 'Мп/ч']

К сожалению, я не знаю, как поступить в ситуации, когда кортеж выглядит, например, как (None, 'Miasto'), который заканчивается так:

ind = pd.Index([e[1] + '-' + e[0] для e в mi]) TypeError: должен быть str, а не NoneType


person Uzzy    schedule 29.09.2017    source источник


Ответы (2)


Начиная с Python 3.6 вы можете использовать форматированные строковые литералы. , также известные как f-строки

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

person kaidokuuppa    schedule 29.09.2017

Извините за беспокойство, я решил эту проблему, написав короткую функцию, которая меняет None на пустую строку '':

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)
person Uzzy    schedule 29.09.2017