Выбор строк, в которых числовое значение столбца меняет знак через openpyxl - PullRequest
0 голосов
/ 19 июня 2019

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

ROW:  VALUE:
1      1
2      2
3      3
4      4
5     -4
6     -1
7     -6
8      2
9      3
10    -3

Я хочу напечатать строку, в которой значение изменяется с положительного на отрицательное, и наоборот.Таким образом, в приведенном выше примере строки 5, 8 и 10 будут напечатаны в консоли.Как я могу использовать оператор if в цикле for для перебора столбца в openpyxl?

Пока я могу печатать все ячейки в столбце:

import openpyxl
wb = openpyxl.load_workbook('ngt_log.xlsx')
sheet = wb.get_sheet_by_name('sheet1')
for i in range(1, 10508, 1):   # 10508 is the length of the column
    print(i, sheet.cell(row=i, column=6).value)

Моя идея состояла в том, чтобы просто добавить оператор if внутри цикла for:

for i in range(1, 10508, 1):   # 10508 is the length of the column
    if(( i > 0 and (i+1) < 0) or (i < 0 and (i+1) > 0)):
        print((i+1), sheet.cell(row=i, column=6).value)

Но это не работает.Правильно ли сформулирован оператор if?

Ответы [ 4 ]

1 голос
/ 19 июня 2019

Сначала нужно получить значения sheet.cell, а , а затем сделать сравнения:

end_range = 10508
for i in range(1, end_range):
    current, next = sheet.cell(row=i, column=6).value, sheet.cell(row=i+1, column=6).value
    if current > 0 and next < 0 or current < 0 and next > 0:
        print(i+1, next)

Я почти уверен, что в математической библиотеке есть функция sign (),но отчасти излишним.Вы также можете выяснить, что вы хотите сделать, если значения равны 0.

1 голос
/ 19 июня 2019

Мне кажется, что ваше утверждение противоречит само себе

for i in range(1, 10508, 1):   # 10508 is the length of the column
if(( i greater than 0 and (i+1) less than 0) or (i less than 0 and (i+1) greater than 
0)):
    print((i+1), sheet.cell(row=i, column=6).value)

Я написал символы> и <на простом английском языке, но если я больше 0, тогда i + 1 никогда не меньше 0, и наоборот, поэтому они никогда не будут работать, так как оба не могут быть истинными </p>

0 голосов
/ 20 июня 2019

Вы можете использовать флажок для проверки на положительный и отрицательный.

ws = wb['sheet1'] # why people persist in using long deprecated syntax is beyond me
flag = None

for row in ws.iter_rows(max_row=10508, min_col=6, max_col=6):
    cell = row[0]
    sign = cell.value > 0 and "positive" or "negative"
    if flag is not None and sign != flag:
        print(cell.row)
flag = sign
0 голосов
/ 19 июня 2019

Вы можете написать правила для выбора строк, в которых изменился знак, и поместить их в выражение генератора без использования дополнительной памяти, например:

pos = lambda x: x>=0
keep = lambda s, c, i, v: pos(s[c][x].value)!=pos(v.value)
gen = (x+1 for x, y in enumerate(sheet['f']) if x>0 and keep(sheet, 'f', x-1, y))

Затем, когда вам нужно узнать строки, в которых изменился знак, вы просто итерируете gen, как показано ниже:

for row in gen:
   # here you use row
...