Python 如何有效地比较具有相同x和y值的所有行的z值?

Python 如何有效地比较具有相同x和y值的所有行的z值?,python,pandas,numpy,Python,Pandas,Numpy,我有一个包含x、y、z和b列的熊猫数据框。对于每个x和y对(描述像素),我希望比较z值,如果所有z值仅在某个阈值(例如0.3)内不同,则将所有像素的b设置为true。如果某些像素的z值差异大于阈值,则对于z值最小(在阈值内)的像素,仅将b设置为true,对于其他像素,将b设置为false(高于阈值) 我想,我可能会使用pandas的groupby功能,比如 df[['x','y','z','b']].groupby(['x','y']) 以获得具有相同x和y的所有集合。但是如何应用函数来执行即

我有一个包含x、y、z和b列的熊猫数据框。对于每个x和y对(描述像素),我希望比较z值,如果所有z值仅在某个阈值(例如0.3)内不同,则将所有像素的b设置为true。如果某些像素的z值差异大于阈值,则对于z值最小(在阈值内)的像素,仅将b设置为true,对于其他像素,将b设置为false(高于阈值)

我想,我可能会使用pandas的
groupby
功能,比如

df[['x','y','z','b']].groupby(['x','y'])
以获得具有相同x和y的所有集合。但是如何应用函数来执行即将进行的比较等等?或者有一些numpy函数可以做到这一点

例如:

我有下表(作为数据帧)

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 ... x y z b ------------------------------------ 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.6101156正确 ... 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))


我认为jezrael的意思是z系列可能有以下值78,90,90.01,90.02,90.03。在这种情况下,您提到的逻辑将不适用于jezrael@AnantGupta谢谢,那么在这种情况下,预期输出应该是?只是确认一下如果我没有答对问题谢谢,看起来不错!我只是在测试。你假设的最小值是正确的。根据上面提到的逻辑,答案应该是假,真,假,假,假
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