从一个pandas数据帧中,我想要删除"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应当仅留下对应于ROI5的三行(ROI4具有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];发布于 2019-12-11 14:41:32
你可以做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发布于 2019-12-11 14:34:50
可以同时使用多个过滤条件,避免创建中间数据帧(空间复杂度高,效率高),例如:
for roi in data.roi.unique():
subdata2 = data[(data['roi']==roi) &
(data['s']>=50) &
(data['b2']>=50)]
if (subdata2.size/10)/(data[data['roi']==roi].size/10) < 0.5:
data = data[data['roi']!=roi]https://stackoverflow.com/questions/59279959
复制相似问题