Pandas:如何删除每个索引组的最低5%百分位数?

4

我对Python Pandas存在以下问题(相对而言,我对它还比较新手):我有一个简单的数据集,其中包含日期一列和对应数值一列。通过以下方式,我可以根据日期和数值对该数据框进行排序:

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

现在,我的想法是要针对每个月份(每个组)的value列中最低的5%进行处理。我知道应该使用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来完成这个任务,而且速度更快,但我的问题实际上是如何将其独立地应用于每个分组(按月份排序的值列的每个部分)在数据框架中,而不仅仅是整个数据框架。
非常感谢任何帮助, 谢谢你们了, 诚挚问候, Berti
2个回答

7

使用GroupBy.transform和lambda函数来处理与原始DataFrame大小相同的Series,因此可以通过布尔索引进行过滤:

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

1

你可以创建自己的函数并应用它:

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)

[out]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接