Если значение не находится в диапазоне Python

#python #if-statement

#python #оператор if

Вопрос:

Я пытаюсь разделить данные на категории на основе значений. Таким образом, значениям выше -25 присваивается уровень медведя 0 и так далее. Но когда я смотрю на данные, я вижу, что есть значения ниже -25, которым присваивается уровень медведя 0. И это верно для всех категорий.

 ###############################################################
Bear_level = ['high', 'medium-high', 'medium', 'medium-low', 'low', 'very-low']

Level=[]
for value in data_shifted[k]['SCI300max [um]']:
    if value >= -25:
        Level.append(Bear_level[0])
    elif value < -25 and value >= -50:
        Level.append(Bear_level[1])
    elif value < -50 and value >= -75:
        Level.append(Bear_level[2])
    elif value < -75 and value >= -100:
        Level.append(Bear_level[3])
    elif value < -100 and value >= -150:
        Level.append(Bear_level[4])
    else:
        Level.append(Bear_level[5])

Amount = 0
for i in Bear_level:
    for m in range(int(len(Level))):
        if Level[m] ==i:
            Amount  = 1
    print(Amount)
    Amount = 0    

for k in data_shifted:
    data_shifted[k]['Bear Level']= Level


data_interp={k:[] for k in progression}   
for k in data_interp:
    data_interp[k]=data_shifted[k][['Chainage [m]', 'Driving Speed [m/s]', 'Latitude', 'Longitude', 'Road temperature [C]', 'Air temperature [C]','Temp corrected Bells2_50','Load Left [kg]','Load Right [kg]', 'Dmax [um]', 'D0 [um]', 'D300 [um]', 'D600 [um]', 'D900 [um]', 'D1200 [um]', 'D1500 [um]', 'SCI300max [um]','SCI300 [um]','SCI300diff [um]', 'SCI600max [um]','SCI600 [um]', 'SCI900max [um]','SCI900 [um]', 'SCI600max-SCI300max [um]', 'SCI900max-SCI600max [um]','speedfilter', 'Bear Level', 'Traffic [ESALs x day]', 'Layer1 Thickness [m]']]
    data_interp[k]= data_interp[k][data_interp[k]['speedfilter']=='Pass']    

all_data_list = [ v for k,v in data_interp.items()] 
all_data = pd.concat(all_data_list ,axis=0)

all_data.to_csv("all_data.csv", index=True, header=True)##### generate csv file with all data

H_bear_section = all_data[all_data['Bear Level'] == Bear_level[0]]
MH_bear_section = all_data[all_data['Bear Level'] == Bear_level[1]]
M_bear_section = all_data[all_data['Bear Level'] == Bear_level[2]]
ML_bear_section = all_data[all_data['Bear Level'] == Bear_level[3]]
L_bear_section = all_data[all_data['Bear Level'] == Bear_level[4]]
VL_bear_section = all_data[all_data['Bear Level'] == Bear_level[5]]

####### Correlations analysis##################
  

Я надеюсь, что есть кто-то, кто способен увидеть проблему, поскольку я теряюсь в поисках идей.

Комментарии:

1. В первом цикле for я не понимаю роли переменной k . Сначала я подумал, что у вас есть числовая таблица (двумерная), но эта строка заставляет меня задуматься, поскольку кажется, что data_shifted[k]['SCI300max [um]'] это массив. Но тогда я действительно не понимаю, почему вы копируете один и тот же массив Level в каждом data_shifted[k]['Bear Level'] . Не могли бы вы, пожалуйста, объяснить типы данных?

2. сначала вам нужно проверить свою логику на самый экстремальный вариант. каждое значение меньше -25

3. Спасибо, что рассмотрели мою проблему. Таким образом, data_shifted — это словарь с 17 фреймами данных. От 0 до 16. Изначально я начал с [0] вместо [k], но это ничего не изменило.

4. @BendikKnapstad Спасибо, что рассмотрели мою проблему. Это имеет смысл. Я попробую это.

5. Пожалуйста, предоставьте воспроизводимый пример, с тестовым вводом и выводом, показывающим некорректность

Ответ №1:

вам нужно изменить свою логику. все значения ниже -25: поэтому сначала вам нужно проверить наименьшее число

 for value in data_shifted[k]['SCI300max [um]']:
    if value <= -150:
        Level.append(Bear_level[5])
    elif value < -100 and value >= -150:
        Level.append(Bear_level[4])
    elif value < -75 and value >= -100:
        Level.append(Bear_level[3])
    elif value < -50 and value >= -75:
        Level.append(Bear_level[2])
    elif value < -25 and value >= -50:
        Level.append(Bear_level[1])
    else:
        Level.append(Bear_level[0])
  

И вам действительно не нужны предложения and:

 for value in data_shifted[k]['SCI300max [um]']:
    if value <= -150:
        Level.append(Bear_level[5])
    elif value < -100:
        Level.append(Bear_level[4])
    elif value < -75:
        Level.append(Bear_level[3])
    elif value <:
        Level.append(Bear_level[2])
    elif value < -25:
        Level.append(Bear_level[1])
    else:
        Level.append(Bear_level[0])
  

Комментарии:

1. Ваше второе условие никогда не будет истинным

2. Итак, я попытался изменить логику и заменить 0 на k. Но все равно получаю фреймы данных со значениями за пределами диапазона. Level=[] for value in data_shifted[0]['SCI300max [um]']: if value < -150: Level.append(Bear_level[5]) elif value < -100 and value >=150: Level.append(Bear_level[4]) elif value < -75 and value >= -100: Level.append(Bear_level[3]) elif value < -50 and value >= -75: Level.append(Bear_level[2]) elif value < -25 and value >= -50: Level.append(Bear_level[1]) else: Level.append(Bear_level[0])