Использование сравнительных операторов для поиска локальных максимумов в столбце фрейма данных - PullRequest
0 голосов
/ 01 июня 2018

У меня есть файл Excel, где каждый столбец представляет последовательные периоды времени.Я хочу определить локальные максимумы для каждого периода времени (т. Е. Внутри каждого столбца).Это код, который у меня есть до сих пор:

    import pandas as pd  
    df = pd.read_excel('my_sheet.xlsx', sheetname='Sheet1')   

    b = df['time_period_1'] 

    i = 1  
    for i in b:  
        if b[i] > b[i-1] and b[i] > b[i+1]:  
            print(b[i]) 
        i=i+1 

Что дает ошибку

    KeyError: 24223 

24223 - это первое значение в столбце
Есть идеи, что происходит?
Спасибо!

1 Ответ

0 голосов
/ 02 июня 2018

Помните, что вы используете «i» как для приращения внутри цикла, так и для элемента b.В основном «for i in b» помещает первое значение «b» в «i», которое равно «24223», но этот ключ неверен, поскольку, конечно, ваш столбец не содержит 24223 элемента.

В основном изменитеимя одного из ваших индексов.Например:

k = 1  
for i in b:  
    if i > b[k-1] and i > b[k+1]:  
        print(b[k]) 
    k += 1 

(не уверен здесь, если вы хотите напечатать (b [k]) или напечатать (i), но вы получите точку)

Отредактируйте 1: , вы должны использовать «i» как объект в «b», так как вам не нужно, чтобы он был индексом.Когда вы используете «для я в б», я уже содержимое ячейки.Используйте «b [i]» только тогда, когда i является индексом.Здесь вы можете либо:

for i in range(len(b)) :
  if b[i] > ...

, где i - индекс, либо:

for i in b :
   if i > ...

, где i - объект.

Редактировать 2:, чтобы избежать доступа к b [k + 1] для последнего индекса (который вызывает ошибку, так как k + 1 не существует), используйте условие if.Также для ясности я бы рекомендовал использовать только один индекс.Обратите внимание, что для достижения этого вам также необходимо условие для первой строки, так как b [-1] будет ссылаться на последнюю строку в python, и я предполагаю, что это не то, с чем вы хотите сравнить первую строку.Вот код, который должен работать:

for i in range(len(b)):           #range begins implicitly at 0
   if i > 0 and i < len(b)-1:     #so you are not on the first nor last row
      if b[i] > b[i-1] and b[i] > b[i+1]:
         print(b[i])
   elif i==0:        #first row, to be compared with the following one only
      if b[i] > b[i+1]:
         print(b[i])
   else:            #last row, to be compared with the previous one only
      if b[i] > b[i-1]:
         print(b[i])

Существуют краткие и элегантные способы сделать это, но я думаю, что это самый ясный.

...