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

时间:2019-06-19 08:49:27

标签: python pandas numpy

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

我认为,我可能会使用熊猫的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
...

1 个答案:

答案 0 :(得分:2)

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