基于几列数据删除pandas数据框中的行

2024-10-17 00:21:01 发布

您现在位置:Python中文网/ 问答频道 /正文

从pandas数据帧中,我想删除“roi”,其中有一半或更多 对于任何列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有三行中的两行) 其中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];

Tags: 数据方法示例pandasfordatasizeb2
2条回答

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

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]

你可以做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

相关问题 更多 >