Как управлять значениями, попадающими между двумя диапазонами в python? - PullRequest
2 голосов
/ 12 января 2020

у меня есть фрейм данных df:

     A  
1   12       
2   15.5
3   20.5
4   30.5
5   15

диапазон:

x_range = [list(range(0,5)),list(range(6,10)),list(range(11,15)),list(range(15,20)),list(range(21,25))]

функция:

def min_max_range(x,y):
    for a in y:
        if int(x) in a:
            min_val = min(a)
            max_val = max(a)+1
            return max_val - min_val

Результат должен выглядеть следующим образом:

df['A'].apply(lambda x: min_max_range(x,x_range))

     A      B
1   12      5 
2   15      5
3   20.5    4
4   5.5     4
5   15.5    4

Но что я получаю, так это:

     A      B
1   12      4 
2   15      5
3   20.5   NA
4   5.5    NA
5   15.5   NA

Я знаю, почему это происходит, не учитывая значения между range(0,5) = [0,1,2,3,4,5] и range(6,10) = [6,7,8,9,10], сейчас это не учитывая значения between 5 & 6. Если есть значение 5.5 or 5.8. тогда он не будет учитывать это и вернет NA. Как я могу избежать этого?

1 Ответ

2 голосов
/ 12 января 2020

Кажется, проблема в последнем значении, это не 5, а 4, поэтому в диапазонах отсутствует последнее значение:

print (list(range(0,5)))
[0, 1, 2, 3, 4]
print (list(range(6,10)))
[6, 7, 8, 9]
print (list(range(11,15)))
[11, 12, 13, 14]

Я думаю, что необходимо добавить одно значение ко второму целому числу в таких диапазонах, как :

print (list(range(0,6)))
[0, 1, 2, 3, 4, 5]
print (list(range(6,11)))
[6, 7, 8, 9, 10]
print (list(range(11,16)))
[11, 12, 13, 14, 15]

После изменения значений NaN s:

x_range = [list(range(0,6)),list(range(6,11)),list(range(11,16)),
           list(range(16,21)),list(range(21,26))]

def min_max_range(x,y):
    for a in y:
        if int(x) in a:
            min_val = min(a)
            max_val = max(a)+1
            return max_val - min_val

df['B'] = df['A'].apply(lambda x: min_max_range(x,x_range))
print (df)
      A  B
1  12.0  5
2  15.0  5
3  20.5  6
4   5.5  6
5  15.5  5
...