Найти значения, которые ближе всего к заданным значениям и вернуть индекс строки - PullRequest
3 голосов
/ 14 января 2020

Есть ли простой способ найти ближайшие значения способом numpy? И получить в качестве вывода номер строки?

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

value= [0.33, 0.66, 0.99]

У меня есть данные

random= pd.DataFrame()
random=random.assign(data='')
random.data= np.linspace(0.1,1.0,10)

data
0     0.1
1     0.2
2     0.3
3     0.4
4     0.5
5     0.6
6     0.7
7     0.8
8     0.9
9     1.0

В качестве ответа теперь функция должна выдавать строки, которые имеют data, ближайший к value

answer= [2,6,9]

Я пытаюсь что-то с

idx = (np.abs(random.data - value)).argmin()

, но я я борюсь с l oop и строками в качестве ответа.

Кто-нибудь знает простой способ? : -)

Ответы [ 2 ]

2 голосов
/ 14 января 2020
df = pd.DataFrame({'data':np.linspace(0.1, 1.0, 10)})

values = [0.33, 0.66, 0.99]

d = np.abs(values - df.values)

np.argmin(d, axis=0)

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

np.where(d == d.min(0))[0]

вместо np.argmin.

0 голосов
/ 14 января 2020

попробуйте с:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

value = 0.15

random= pd.DataFrame()
random=random.assign(data='')
random.data= np.linspace(0.1,1.0,10)

answer = []
temp = []
for d in random.data:
    temp.append(np.abs(d - value))

for i in range(0, len(temp)):
    try:
        answer.append(temp.index(min(temp), i, i+1))
    except ValueError as e:
        print(e)

print(answer)

В функции это будет:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import pandas as pd
import numpy as np

def get_min(data, value):
    answer = []
    temp = []
    for d in data:
        temp.append(np.abs(d - value))
    for i in range(0, len(temp)):
        try:
            answer.append(temp.index(min(temp), i, i+1))
        except ValueError as e:
            print(e)
    return answer

random= pd.DataFrame()
random=random.assign(data='')
random.data= np.linspace(0.1,1.0,10)

print(get_min(random.data, 0.15))

regards

...