【问题标题】:Find columns within a certain percentile of a DataFrame在 DataFrame 的某个百分位内查找列
【发布时间】:2018-09-29 00:53:27
【问题描述】:

拥有一个多列数据框,我对如何保留/获取每列位于第 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 轴显示行。所以我需要以某种方式通过设置百分位标准来删除这个 blob

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

【问题讨论】:

  • 您的意思是保留某列第 25 和第 75 个百分位之间的行吗?如果整行落在这些百分位数之间,您如何定义?
  • 我会更新帖子,好问题。我的意思是每列的百分位数,完全正确!
  • 在哪一列的第 25 和第 75 个百分位内?如果它的所有列也意味着深度(因为它与所有其他列具有不同类型的标签)我怀疑你的意思可能是保持该列的值 WHERE 其他列在限制范围内但如果这些限制适用对于所有其他列,那么应该发生什么?短版 - 您希望看到什么?
  • 抱歉,我更新了帖子:我希望看到更少的行数,所以我必须消除一系列作为时间序列异常值的测量值。这里的深度列已经过时了,其他列应该都在 25-75 个百分位之间,所以我想最后我会采用最严格的标准将它应用于整个数据框
  • 我认为混淆源于一行将有多个值的事实。这些值中的每一个都可以单独标记为其各自列的异常值。那么,如果any 的值在外部,或者仅当all 时,您是否要删除一行。或者,也许设置一个阈值?

标签: python pandas dataframe percentile


【解决方案1】:

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

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

【讨论】:

    【解决方案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])

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 2020-03-13
      • 2015-07-05
      • 2017-01-27
      • 2021-01-18
      • 1970-01-01
      相关资源
      最近更新 更多