Python 基于分组分位数的子集原始数据帧

Python 基于分组分位数的子集原始数据帧,python,pandas,statistics,Python,Pandas,Statistics,这是我的df: NAME DEPTH A1 A2 A3 AA4 AA5 AI4 AC5 Surface 0 Ron 2800.04 8440.53 1330.99 466.77 70.19 56.79 175.96 77.83 C 1 Ron 2801.04 6084.15 997.13 383.31 64.68 51.09 154.59 73.88 C

这是我的
df

   NAME  DEPTH    A1        A2      A3      AA4     AA5     AI4     AC5     Surface 
0  Ron   2800.04  8440.53   1330.99 466.77  70.19   56.79   175.96  77.83   C
1  Ron   2801.04  6084.15   997.13  383.31  64.68   51.09   154.59  73.88   C 
2  Ron   2802.04  4496.09   819.93  224.12  62.18   47.61   108.25  63.86   C 
3  Ben   2803.04  5766.04   927.69  228.41  65.51   49.94   106.02  62.61   L 
4  Ron   2804.04  6782.89   863.88  223.79  63.68   47.69   101.95  61.83   L 
... ... ... ... ... ... ... ... ... ... ...
因此,我的第一个问题在这里得到了回答:

使用:

df.groupby('Surface')['DEPTH'].quantile([.1, .9])
我可以从按表面分组的深度中获得百分位数[.1,.9],这就是我需要的:

Surface        
C           0.1    2800.24
            0.9    2801.84
L           0.1    3799.74
            0.9    3960.36
N           0.1    2818.24
            0.9    2972.86
P           0.1    3834.94
            0.9    4001.16
Q           0.1    3970.64
            0.9    3978.62
R           0.1    3946.14
            0.9    4115.96
S           0.1    3902.03
            0.9    4073.26
T           0.1    3858.14
            0.9    4029.96
U           0.1    3583.01
            0.9    3843.76
V           0.1    3286.01
            0.9    3551.06
Y           0.1    2917.00
            0.9    3135.86
X           0.1    3100.01
            0.9    3345.76
Z           0.1    4128.56
            0.9    4132.56
Name: DEPTH, dtype: float64
现在,我相信这已经是最难的部分了。剩下的是对原始df进行子集设置,以仅包括那些
深度
百分位数
.1和.9
之间的值。例如:
DEPTH
曲面组“Z”中的值必须大于4128.56且小于4132.56。 请注意,我需要的是
df
,而不是
df.groupby(“Surface”)
:最终的
df
将完全相同,但深度在边界之外的行应该删除

这看起来很容易。。。有什么想法吗?
谢谢

当您需要过滤组内的行时,使用
groupby
+
transform
将结果广播到组内的每一行,然后过滤原始数据帧通常更简单、更快。在这种情况下,我们可以检查
'DEPTH'
是否在这两个分位数之间

样本数据 代码
为了清楚起见,这里您可以看到
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]
gp = df.groupby('Surface')['DEPTH']

df1 = df[df['DEPTH'].between(gp.transform('quantile', 0.1),
                             gp.transform('quantile', 0.9))]
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]