我有一个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 ...
答案 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