在DataFrame的一定百分比内查找列

时间:2018-09-28 16:33:17

标签: python pandas dataframe percentile

具有多列数据框,我对如何保留/获取每列第25至75个百分位数之间的数据框部分感兴趣? 我需要删除值在25-75%范围之外的行(只是时间步长)

  df %>% 
  gather %>% 
  count(key,value) %>% 
  spread(key, n)

我希望看到的行数更少,所以我必须消除一系列与时间序列相离的度量。

enter image description here

这来自原始数据集,其中x轴显示行。因此,我需要通过设置百分位数标准来删除此Blob

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

2 个答案:

答案 0 :(得分:2)

我不是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

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

如果您只想删除包含范围之外的所有所有值的行,则可以使用:

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

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

答案 1 :(得分:2)

在下面的基础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]