我对python pandas有以下问题(我对它比较陌生):我有一个简单的dataset,其中包含一列date和一列相应的值。通过执行以下操作,我可以按日期和值对此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中的每个组(值列的每个部分按月份排序),而不仅仅是整个Dataframe。
如有任何帮助,我将不胜感激非常感谢,致以亲切的问候,Berti
发布于 2019-12-17 18:36:12
将带有lambda函数的GroupBy.transform用于与原始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发布于 2019-12-17 18:40:00
您可以创建自己的函数并对其执行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: int64https://stackoverflow.com/questions/59372323
复制相似问题