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