[英]Python Pandas - Removing Rows From A DataFrame Based on a Previously Obtained Subset
[英]Removing rows from pandas dataframe based on several columns
從熊貓數據框中,我想刪除“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
您可以同時使用多個過濾條件以避免創建中間數據幀(空間復雜度效率),例如:
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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.