Когда вам нужно отфильтровать строки в группах, часто проще и быстрее использовать groupby
+ transform
, чтобы транслировать результат на каждую строку в группе, а затем фильтровать исходный DataFrame. В этом случае мы можем проверить, находится ли 'DEPTH'
между этими двумя квантилями.
Пример данных
import pandas as pd
import numpy as np
np.random.seed(42)
df = pd.DataFrame({'DEPTH': np.random.normal(0,1,100),
'Surface': np.random.choice(list('abcde'), 100)})
Код
gp = df.groupby('Surface')['DEPTH']
df1 = df[df['DEPTH'].between(gp.transform('quantile', 0.1),
gp.transform('quantile', 0.9))]
Для ясности здесь вы можете видеть, что transform
будет транслировать скалярный результат на каждую строку, принадлежащую группе, в этом случае определенную как 'Surface'
pd.concat([df['Surface'], gp.transform('quantile', 0.1).rename('q = 0.1')], axis=1)
# Surface q = 0.1
#0 a -1.164557
#1 e -0.967809
#2 a -1.164557
#3 c -1.426986
#4 b -1.544816
#.. ... ...
#95 a -1.164557
#96 e -0.967809
#97 b -1.544816
#98 b -1.544816
#99 b -1.544816
#
#[100 rows x 2 columns]