Pandas:如何降低每个索引组的最低第 5 个百分位数?

Pandas: how to drop the lowest 5th percentile for each indexed group?

我对 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)]

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

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

使用GroupBy.transform with lambda function for Series with same size like original DataFrame, so possible filter by 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

您可以创建自己的函数,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