pandas 从 Dataframe 中删除相对差值小于阈值的所有相邻行对中具有最小值的行

new9mtju  于 2023-05-12  发布在  其他
关注(0)|答案(1)|浏览(119)

我有一个pandas dataframe df,列为“x_center”,“width”,“confidence”等。它们都具有浮点值。我已经计算了另一个名为“relative_xc_diff”的列,它是“x_center”值相对于“width”值的相对差异。

x_centers = df["x_center"].values
relative_xc_diff = (abs(x_centers[1:] - x_centers[:-1]) / df["width"].values[:-1]) * 100
df["relative_xc_diff"] = 0
df["relative_x_diff"].values[1:] = relative_xc_diff

现在,我需要检查是否对于任何一对行,“relative_xc_diff”< 50,如果是这种情况,我需要只保留“confidence”较大的行,并删除置信度较低的行。
如果我的初始数据框架是这样的:

x_center  y_center    width   height  confidence  relative_xc_diff 
0  0.28197   0.30739  0.11030  0.28363     0.83297           0.000000  
1  0.41412   0.32434  0.11954  0.27971     0.84027         119.809610  
2  0.59346   0.34406  0.10318  0.28965     0.83406         150.025096  
3  0.71342   0.36437  0.10287  0.28662     0.78227         116.262842  
4  0.13095   0.70592  0.12195  0.27470     0.86141         566.219500  
5  0.18598   0.71642  0.10878  0.27158     0.77353          45.125051   
6  0.45247   0.75308  0.10018  0.28254     0.76669         244.980695  
7  0.57028   0.77230  0.09996  0.28853     0.81539         117.598323  
8  0.60460   0.78803  0.10151  0.28281     0.82202          34.333733   
9  0.80243   0.80597  0.10614  0.29262     0.77144         194.887203  
10  0.96391   0.77255  0.07218  0.44827     0.30487        152.138685

我需要删除索引为5和7的行(注意,“relative_xc_diff”的第一个值没有意义,所以我需要忽略它)

blmhpbnm

blmhpbnm1#

使用boolean indexing,将第一个值设置为True,并链接另一个掩码以测试confidence的差异。如果False通过移位和链条件测试先前的值,对于按位AND使用&,对于按位OR使用|

m1 = (df['x_center'].diff().abs().div(df["width"].shift())
                                .mul(100).fillna(0).le(50))

m1.iat[0] = False

m2 = df["confidence"].diff().le(0)

m = (m1 & m2) | (m1.shift(-1, fill_value=False) & m2)

out = df[~m]
print (out)
    x_center  y_center    width   height  confidence
0    0.28197   0.30739  0.11030  0.28363     0.83297
1    0.41412   0.32434  0.11954  0.27971     0.84027
2    0.59346   0.34406  0.10318  0.28965     0.83406
3    0.71342   0.36437  0.10287  0.28662     0.78227
4    0.13095   0.70592  0.12195  0.27470     0.83141
6    0.45247   0.75308  0.10018  0.28254     0.76669
7    0.57028   0.77230  0.09996  0.28853     0.81539
8    0.68460   0.78803  0.10151  0.28281     0.82202
9    0.80243   0.80597  0.10614  0.29262     0.77144
10   0.96391   0.77255  0.07218  0.44827     0.30487

它是如何工作的:

print (df.assign(m1=m1, m2=m2, m=m))
    x_center  y_center    width   height  confidence     m1     m2      m
0    0.28197   0.30739  0.11030  0.28363     0.83297  False  False  False
1    0.41412   0.32434  0.11954  0.27971     0.84027  False  False  False
2    0.59346   0.34406  0.10318  0.28965     0.83406  False   True  False
3    0.71342   0.36437  0.10287  0.28662     0.78227  False   True  False
4    0.13095   0.70592  0.12195  0.27470     0.83141  False  False  False
5    0.18598   0.71642  0.10878  0.27158     0.77353   True   True   True
6    0.45247   0.75308  0.10018  0.28254     0.76669  False   True  False
7    0.57028   0.77230  0.09996  0.28853     0.81539  False  False  False
8    0.68460   0.78803  0.10151  0.28281     0.82202  False  False  False
9    0.80243   0.80597  0.10614  0.29262     0.77144  False   True  False
10   0.96391   0.77255  0.07218  0.44827     0.30487  False   True  False

相关问题