Python 如何有效地比较具有相同x和y值的所有行的z值?
我有一个包含x、y、z和b列的熊猫数据框。对于每个x和y对(描述像素),我希望比较z值,如果所有z值仅在某个阈值(例如0.3)内不同,则将所有像素的b设置为true。如果某些像素的z值差异大于阈值,则对于z值最小(在阈值内)的像素,仅将b设置为true,对于其他像素,将b设置为false(高于阈值) 我想,我可能会使用pandas的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的所有集合。但是如何应用函数来执行即
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