Как вернуть строку заголовка на основе максимального значения ячейки в Openpyxl - PullRequest
0 голосов
/ 08 марта 2019

Доброе утро, ребята!Быстрый вопрос для Openpyxl:

Я работаю с Python, редактирую документ xlsx и генерирую различные статистические данные.Часть моего сценария заключается в создании максимальных значений диапазона ячеек:

temp_list=[]
temp_max=[]

for row in sheet.iter_rows(min_row=3, min_col=10, max_row=508, max_col=13): 
    print(row)

    for cell in row:
        temp_list.append(cell.value)

    print(temp_list)
    temp_max.append(max(temp_list))
    temp_list=[]

Я также хотел бы иметь возможность печатать строку заголовка столбца, который содержит максимальное значение для желаемого диапазона ячеек,Моя структура данных выглядит следующим образом:

Data Structure

Есть идеи, как это сделать?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

Во-первых, спасибо Бернардо за подсказку.Я нашел прилично работающее решение, но все еще есть небольшая проблема.Возможно, кто-то может помочь.Позвольте мне изменить мое первоначальное утверждение: вот код, с которым я сейчас работаю:

temp_list=[]
headers_list=[]

for row in sheet.iter_rows(min_row=3, min_col=27, max_row=508, max_col=32): #Index starts at 1 // Here we set the rows/columns containing the data to be analyzed
    for cell in row:
        temp_list.append(cell.value)
    for cell in row:
        if cell.value == max(temp_list):
            print(str(cell.column))
            print(cell.value)
            print(sheet.cell(row=1, column=cell.column).value)
            headers_list.append(sheet.cell(row=1,column=cell.column).value)
        else:
            print('keep going.')
    temp_list = []

Эта формула работает, но имеет небольшую проблему: если, например, строка имеет одно и то же значение дважды (т.е.: 25,9,25,8,9), этот цикл будет печатать 2 заголовка вместо одного.У меня вопрос:

как мне заставить этот цикл учитывать только первое совпадение максимального значения в строке?

0 голосов
/ 08 марта 2019

Вы, вероятно, хотите что-то вроде этого:

headers = [c for c in next(ws.iter_rows(min_col=27, max_col=32, min_row=1, max_row=1, values_only=True))]

for row in ws.iter_rows(min_row=3, min_col=27, max_row=508, max_col=32, values_only=True):
   mx = max(row)
   idx = row.index(mx)
   col = headers[idx]
0 голосов
/ 08 марта 2019

Это похоже на типичную проблему Excel с INDEX / MATCH.

Вы пытались получить индекс для максимального значения в каждом списке temp_list?

Вы можете использовать функцию, такую ​​как numpy.argmax (), чтобы получить индекс вашего максимального значения в вашем массиве «temp_list», затем использовать этот индекс, чтобы найти заголовок и добавить строку в новый список с именем,скажем, "max_headers", который содержит все строки заголовка в порядке появления.

Это будет выглядеть примерно так

for cell in row:
        temp_list.append(cell.value)
        i_max = np.argmax(temp_list)
        max_headers.append(cell(row = 1, column = i_max).value)

И так далее, и тому подобное.Конечно, для того, чтобы это работало, ваш список temp_list должен быть пустым массивом вместо простого списка python, и список max_headers должен быть определен.

...