我想从熊猫数据框中删除一半或更多的“ 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

09-10 05:19
查看更多