在 DataFrame 的某个百分位数内查找列

Find columns within a certain percentile of a DataFrame

有一个多列数据框,我感兴趣的是如何 keep/get 数据框中每列的第 25 个和第 75 个百分位数之间的部分? 我需要删除值在 25-75 百分位数范围之外的行(只是时间步长)

import numpy as np
import pandas as pd   

df1 = pd.DataFrame({
       '400.0': [13.909261, 13.758734, 13.513627, 13.095409, 13.628918, 12.782643, 13.278548, 13.160153, 12.155895, 12.152373, 12.147820, 13.023997, 15.010729, 13.006050, 13.002356],
       '401.0': [14.581624, 14.173803, 13.757856, 14.223524, 14.695623, 13.818065, 13.300235, 13.173674, 14.145402, 14.144456, 13.142969, 13.022471, 14.010802, 14.006181, 14.002641],
       '402.0': [15.253988, 15.588872, 15.002085, 15.351638, 14.762327, 14.853486, 15.321922, 14.187195, 15.134910, 15.136539, 15.138118, 15.020945, 15.010875, 15.006313, 15.002927],
       '403.0': [15.633908, 14.833914, 15.146499, 15.431543, 15.798185, 14.874350, 14.333470, 14.192128, 15.130119, 15.134795, 15.136049, 15.019307, 15.012037, 15.006674, 15.003002],
       })

我希望看到的行数较少,因此我必须消除作为时间序列异常值的测量范围。

这是来自原始数据集,其中 x 轴显示行。所以我需要通过设置百分位标准

以某种方式删除这个斑点

最后我会采用最严格的标准将其应用于整个数据帧

我不是 100% 确定这就是您想要的,但是 IIUC,您可以创建一个掩码,然后将其应用于您的数据框。

df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).all(1)]

       400.0      401.0      402.0      403.0
8  12.155895  14.145402  15.134910  15.130119
9  12.152373  14.144456  15.136539  15.134795

这将删除任何包含超出范围的任何列中的任何值的行。

如果您只想删除包含 all 值且超出范围的行,您可以使用:

df1[df1.apply(lambda x: x.between(x.quantile(.25), x.quantile(.75))).any(1)]

        400.0      401.0      402.0      403.0
2   13.513627  13.757856  15.002085  15.146499
3   13.095409  14.223524  15.351638  15.431543
5   12.782643  13.818065  14.853486  14.874350
6   13.278548  13.300235  15.321922  14.333470
7   13.160153  13.173674  14.187195  14.192128
8   12.155895  14.145402  15.134910  15.130119
9   12.152373  14.144456  15.136539  15.134795
10  12.147820  13.142969  15.138118  15.136049
11  13.023997  13.022471  15.020945  15.019307
12   0.010729  14.010802  15.010875  15.012037
13   0.006050  14.006181  15.006313  15.006674
14   0.002356  14.002641  15.002927  15.003002

如果任何列中的任何值落在其各自列的百分位数范围内,则行将保留在此处。

在此处对底层 numpy 数组进行操作会更快:

a = df1.values
q1 = np.quantile(a, q=0.25, axis=0)
q2 = np.quantile(a, q=0.75, axis=0)

mask = ((q1 < a) & (a < q2)).all(1)

df1[mask]

       400.0      401.0      402.0      403.0
8  12.155895  14.145402  15.134910  15.130119
9  12.152373  14.144456  15.136539  15.134795

如果要排除 那些行

,请反转掩码 (df[~mask])