Найдите два приблизительных значения в одной серии панд.Создать флаг на другом на основе критерия - PullRequest
0 голосов
/ 25 сентября 2018

Я ищу:

1- Просмотрите все значения одной серии (количество)

2- Динамически выделите все, что попадает под критерии (абсолютные (1,5) единицы измерения вэтот пример) с «флагом» в другой серии (рядом).

3 - в случае значения True флаг должен отображать все значения индекса, разделенные пробелом или другим символом

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

index | quantity |      near
----------------------------------
inv1  |  2017.45 |  no
inv2  |   102.10 |  inv2 inv3 inv6
inv3  |   101.60 |  inv2 inv3 
inv5  |   200.4  |  no
inv6  |   103.39 |  inv2 inv6

Есть идеи?Заранее спасибо.

Панды 0.21.1 и Python 3.6.5

1 Ответ

0 голосов
/ 25 сентября 2018

IIUC:

q = df.quantity.values
x = df['index']

i, j = np.where(np.abs(np.subtract.outer(q, q)) <= 1.5)

df.assign(near=x.map(x[i].groupby(x[j].values).apply(' '.join)))

  index  quantity            near
0  inv1   2017.45            inv1
1  inv2    102.10  inv2 inv3 inv6
2  inv3    101.60       inv2 inv3
3  inv5    200.40            inv5
4  inv6    103.39       inv2 inv6

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

q = df.quantity.values
x = df['index']

m = np.abs(np.subtract.outer(q, q)) <= 1.5
np.fill_diagonal(m, False)
i, j = np.where(m)

df.assign(near=x.map(x[i].groupby(x[j].values).apply(' '.join)).fillna('no'))

  index  quantity       near
0  inv1   2017.45         no
1  inv2    102.10  inv3 inv6
2  inv3    101.60       inv2
3  inv5    200.40         no
4  inv6    103.39       inv2
...