#python #python-2.7 #openpyxl
#python #python-2.7 #openpyxl
Вопрос:
У меня есть файл Excel с 2 листами. На первом листе у меня 100 столбцов х 23 строки. Первый столбец содержит имена, а остальные 99 столбцов содержат числа. На втором листе у меня есть первый столбец с именами. Я хочу добавить на второй лист среднее значение столбца 99 с первого листа, если имена совпадают. Это то, что я пробовал до сих пор:
wb = openpyxl.load_workbook(".xlsx")
ws1 = wb.get_sheet_by_name('sheet1')
ws2 = wb.get_sheet_by_name('sheet2')
for counter1 in range(39,62): #counter to parse second sheet
for counter2 in range(36, 62):#counter to parse first sheet
if ws1.cell(row=counter1, column=1).value == ws2.cell(row=counter2, column=1).value: # check if column1 from first sheet matches column 1 from second sheet
ws1.cell(row=counter1,column=19).value = ...
я не знаю, как вычислить среднее значение по 99 столбцам, чтобы добавить его сюда.
Я пробовал mean(ws2.cell(строка = counter2, столбец = 2).значение),
но я получил эту ошибку:
Ошибка типа: не удается преобразовать тип «unicode» в числитель / обозначитель
Приветствуется любая помощь
Комментарии:
1. Почему вложенный цикл? Почему вы больше не используете openpyxl API? Почему вы не используете встроенную
sum()
функцию Python?
Ответ №1:
wb = openpyxl.load_workbook(".xlsx")
ws1 = wb.get_sheet_by_name('sheet1')
ws2 = wb.get_sheet_by_name('sheet2')
for counter1 in range(39,62): #counter to parse second sheet
for counter2 in range(36, 62):#counter to parse first sheet
if ws1.cell(row=counter1, column=1).value == ws2.cell(row=counter2, column=1).value: # check if column1 from first sheet matches column 1 from second sheet
summ = 0.0
for col in range(2,101):
summ = float(ws1.cell(row = counter2, column = col).value)
average = summ/99
ws1.cell(row=counter1,column=19).value = average
Итак, я бы сам рассчитал средние значения, суммируя значения столбцов и деля сумму на количество столбцов.
Однако вы уверены, что счетчик 1 относится ко ВТОРОМУ листу, а счетчик 2 — к первому листу? Название предполагает возможную логическую ошибку. Кроме того, почему второй диапазон от 36 до 62, а не, как первый диапазон, от 39 до 62?