我想从熊猫数据框中删除一半或更多的“ rois”
行中的任何一行的s,b1或b2的值都小于50。
这是一个示例数据框:
roi s b1 b2
4 40 60 70
4 60 40 80
4 80 70 60
5 60 40 60
5 60 60 60
5 60 60 60
仅应保留与roi 5相对应的三行(roi 4的3行中有2行
其中s,b1,b2中的至少一个值小于50。
我已经实现了此功能,但想知道是否有更短的时间(例如更快和
清洁剂)的方法:
for roi in data.roi.unique():
subdata = data[data['roi']==roi];
subdatas = subdata[subdata['s']>=50];
subdatab1 = subdatas[subdatas['b1']>=50];
subdatab2 = subdatab1[subdatab1['b2']>=50]
if((subdatab2.size/10)/(subdata.size/10) < 0.5):
data = data[data['roi']!=roi];
最佳答案
您可以执行transform
:
s = (data.set_index('roi') # filter `roi` out of later comparison
.lt(50).any(1) # check > 50 on all columns
.groupby('roi') # groupby
.transform('mean') # compute the mean
.lt(0.5) # make sure mean > 0.5
.values
)
data[s]
输出:
roi s b1 b2
3 5 60 40 60
4 5 60 60 60
5 5 60 60 60