【问题标题】:Pandas: how to drop the lowest 5th percentile for each indexed group?Pandas:如何降低每个索引组的最低第 5 个百分位数?
【发布时间】:2020-04-09 20:14:15
【问题描述】:

我对 python pandas 有以下问题(我对它比较陌生):我有一个简单的数据集,其中包含日期列和相应的值列。我可以通过执行以下操作按日期和值对这个 Dataframe 进行排序:

df = df.sort_values(['date', 'value'],ascending=False)

我得到这个:

date       value
2019-11    100
2019-11    89
2019-11    87
2019-11    86   
2019_11    45
2019_11    33
2019_11    24
2019_11    11
2019_11    8
2019_11    5
2019-10    100 
2019-10    98
2019-10    96
2019-10    94
2019_10    94
2019_10    78
2019_10    74
2019_10    12
2019_10    3
2019_10    1

现在,我想做的是去掉每个月(每个组)值列的最低第五个百分位数。我知道我应该使用 groupby 方法,也许还有一个函数:

df = df.sort_values(['date', 'value'],ascending=False).groupby('date', group_keys=False).apply(<???>)

???是我挣扎的地方。我知道如何将排序后的 Dataframe 上的最低 5% 抑制为一个整体,例如通过执行以下操作:

df = df[df.value > df.value.quantile(.05)]

这是 StackOverflow 上另一篇文章的主题。我知道我也可以使用 numpy 来执行此操作,并且速度要快得多,但我的问题实际上是如何在 Dataframe 中独立地将其应用于 EACH GROUP(值列的每个部分按月份排序),而不仅仅是整个数据框。

任何帮助将不胜感激 非常感谢你, 亲切的问候, 贝尔蒂

【问题讨论】:

    标签: python-3.x pandas dataframe pandas-groupby percentile


    【解决方案1】:

    您可以创建自己的函数并 apply 它:

    def remove_bottom_5_pct(arr):
        thresh = np.percentile(arr, 5)
        return arr[arr > thresh]
    
    df.groupby('date', sort=False)['value'].apply(remove_bottom_5_pct)
    

    [出]

    date       
    2019-11  0     100
             1      89
             2      87
             3      86
             4      45
             5      33
             6      24
             7      11
             8       8
    2019-10  10    100
             11     98
             12     96
             13     94
             14     94
             15     78
             16     74
             17     12
             18      3
    Name: value, dtype: int64
    

    【讨论】:

      【解决方案2】:

      GroupBy.transform 与 lambda 函数一起用于与原始DataFrame 大小相同的系列,因此可以通过boolean indexing 过滤:

      df = df.sort_values(['date', 'value'],ascending=False)
      
      q = df.groupby('date')['value'].transform(lambda x: x.quantile(.05))
      df = df[df.value > q]
      print (df)
             date  value
      4   2019_11     45
      5   2019_11     33
      6   2019_11     24
      7   2019_11     11
      8   2019_11      8
      14  2019_10     94
      15  2019_10     78
      16  2019_10     74
      17  2019_10     12
      18  2019_10      3
      0   2019-11    100
      1   2019-11     89
      2   2019-11     87
      10  2019-10    100
      11  2019-10     98
      12  2019-10     96
      

      【讨论】:

        猜你喜欢
        • 2023-02-09
        • 2010-12-01
        • 2012-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多