首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于多列从pandas数据帧中删除行

基于多列从pandas数据帧中删除行
EN

Stack Overflow用户
提问于 2019-12-11 14:27:53
回答 2查看 50关注 0票数 1

从一个pandas数据帧中,我想要删除"rois“,其中有一半或更多行的s、b1或b2列的值小于50。

下面是一个数据帧示例:

代码语言:javascript
复制
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)。

我已经实现了这一点,但不知道是否有一个更短的(即。更快、更干净)的方法:

代码语言:javascript
复制
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];
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-12-11 14:41:32

你可以做transform

代码语言:javascript
复制
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]

输出:

代码语言:javascript
复制
   roi   s  b1  b2
3    5  60  40  60
4    5  60  60  60
5    5  60  60  60
票数 2
EN

Stack Overflow用户

发布于 2019-12-11 14:34:50

可以同时使用多个过滤条件,避免创建中间数据帧(空间复杂度高,效率高),例如:

代码语言:javascript
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59279959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档