如何根据索引然后选择数据帧行,然后根据条件?



我正在对肺结节图像运行斑点检测程序。对于每个图像,斑点检测器返回检测到的斑点数组及其坐标和半径。然后,我检查真实肺结节坐标是否在任何斑点内,并返回真或假(这将成为下一阶段过程的训练标签)。

我遇到的问题是,对于某些图像,结节位于多个斑点内,因此图像具有两个(或多个)真阳性检测而不是一个。因此,对于这些情况,我想找到最接近地面事实的斑点,并将该单个斑点标记为真阳性。

但是,我正在努力以仅比较每个图像的正面检测的方式对数据帧进行切片。我拥有的数据帧是这样的:

Blob_Y  Blob_X     Blob_R  True_X  True_Y  Label
JPCLN001.npy 0       840.0   220.0  16.970563   817.0   346.0      0
1       832.0   496.0  16.970563   817.0   346.0      0
2       496.0   872.0  69.767869   805.0   483.5      1
3       480.0   796.0  16.970563   805.0   483.5      1
4       820.0   888.0  56.568542   817.0   346.0      0
JPCLN002.npy 5       840.0   220.0  16.970563   817.0   346.0      0
6       832.0   496.0  16.970563   817.0   346.0      1
7       824.0   256.0  30.169889   817.0   346.0      0
8       824.0   172.0  16.970563   817.0   346.0      0
9       820.0   888.0  56.568542   817.0   346.0      0

对于图像JPCLN001.npy我想选择标签等于 1 的行,然后计算第 2 行和第 3 行与(True_X, True_Y)(Blob_X, Blob_Y)的毕达哥拉斯距离。需要为最接近真实坐标的 blob 分配标签 1,另一个假定为误报并标记为 0。

数据帧中有四个图像需要执行此操作。

我尝试通过为每个图像选择相关行并将它们分配给新数据帧,进行距离计算,然后将这些行重新插入回原始数据帧来执行此操作,如下所示:

df = blobs.loc['JPCLN061.npy']
df = df[df['Label'] == 1]
df = df.assign(dist = np.sqrt((df['Blob_X']-df['True_X'])**2 + (df['Blob_Y']-df['True_Y'])**2))
df['Label'][df['dist'] == df['dist'].max()] = 0
df.drop(['dist'], inplace = True, axis = 1)
blobs.update(df)

blobs.update(df)不会更新原始数据帧(我认为这是由于每个数据帧的索引不匹配)。我的方法似乎也相当麻烦,所以如果有人可以帮助我如何做到这一点,那将不胜感激,因为我大部分时间都在研究这个问题!

作为一个快速的工作示例,怎么样:

df = blobs.loc['JPCLN061.npy']
df = df[df['Label'] == 1]
df = df.assign(dist = np.sqrt((df['Blob_X']-df['True_X'])**2 + (df['Blob_Y']- 
df['True_Y'])**2))
df = df.sort_values('dist', ascending=False)
blobs.loc[('JPCLN061.npy', df.index[0]), 'Label'] = 0

如果您发布代码来创建 df,我很乐意帮助您提出更有效的方法!

相关内容

最新更新