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]