Как эффективно сравнить значения z всех строк с одинаковыми значениями x и y? - PullRequest
1 голос
/ 19 июня 2019

У меня есть кадр данных pandas со столбцами x, y, z и b.Для каждой пары x и y (описывающих пиксели) я хочу сравнить значения z и установить для b значение true для всех пикселей, если все значения z отличаются только в пределах определенного порога (например, 0,3).Если значения z отличаются более, чем пороговое значение для некоторых пикселей, тогда установите b в true для пикселей с наименьшим значением z (в пределах порога) и установите b в false для остальных (выше порога).

Думаю, я мог бы использовать функцию groupby панд, например,

df[['x','y','z','b']].groupby(['x','y'])

, чтобы получить все сеты с одинаковыми x и y.Но как я могу применить функцию для выполнения предстоящего сравнения и так далее?Или есть какие-то непонятные функции, которые могли бы это сделать?

Пример:

У меня есть следующая таблица (в качестве фрейма данных)

   x         y              z
-----------------------------
1124       922      78.601423
1124       922      78.602461
1124       922      95.140586
1123       922      78.603544
1123       922      78.604400
1123       922      78.605449
1123       922      78.606395
1123       922      87.247255
1123       922      87.234766
1123       922      78.609117
1123       922      78.610156
...

То, что я хочу получить, будетпохожи

   x         y              z      b
------------------------------------
1124       922      78.601423   true
1124       922      78.602461   true
1124       922      95.140586  false
1123       922      78.603544   true
1123       922      78.604400   true
1123       922      78.605449   true
1123       922      78.606395   true
1123       922      87.247255  false
1123       922      87.234766  false
1123       922      78.609117   true
1123       922      78.610156   true
...

1 Ответ

2 голосов
/ 19 июня 2019

IIUC, использование:

s=df.groupby(['x','y'])['z'].transform('min')
#if you need subtract based on the first value and not min use :
#s=df.groupby(['x','y'])['z'].transform('first')
df=df.assign(b=df.z.eq(s)|(df['z']-s).le(0.3))

       x      y          z      b
0   1124  922.0  78.601423   True
1   1124  922.0  78.602461   True
2   1124  922.0  95.140586  False
3   1123  922.0  78.603544   True
4   1123  922.0  78.604400   True
5   1123  922.0  78.605449   True
6   1123  922.0  78.606395   True
7   1123  922.0  87.247255  False
8   1123  922.0  87.234766  False
9   1123  922.0  78.609117   True
10  1123  922.0  78.610156   True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...