我需要通过仅考虑给定百分位数范围之间的值来估计pandas DataFrameGroupBy的平均值.
例如,给定片段
import numpy as np
import pandas as pd
a = np.matrix('1 1; 1 2; 1 4; 2 1; 2 2; 2 4')
data = pd.DataFrame(a)
groupby = data.groupby(0)
m1 = groupby.mean()
结果是
m1 = 1
0
1 2.333333
2 2.333333
但是,如果选择百分位数范围以排除结果应该是最大值和最小值
m1 = 1
0
1 2
2 2
在估算平均值之前,如何为每个组过滤任意百分位数范围之间的值?例如,仅考虑第20百分位数和第80百分位数之间的值.
最佳答案 您可以使用
np.percentile
或
pd.Series.quantile
的自定义功能.性能差异很小.以下示例包括仅在计算分组平均值时高于20且低于80百分位数的值.
import pandas as pd
import numpy as np
a = np.matrix('1 1; 1 2; 1 4; 2 1; 2 2; 2 4')
data = pd.DataFrame(a)
def jpp_np(df):
def meaner(x, lowperc, highperc):
low, high = np.percentile(x, [lowperc, highperc])
return x[(x > low) & (x < high)].mean()
return df.groupby(0)[1].apply(meaner, 20, 80).reset_index()
def jpp_pd(df):
def meaner(x, lowperc, highperc):
low, high = x.quantile([lowperc/100, highperc/100]).values
return x[x.between(low, high, inclusive=False)].mean()
return df.groupby(0)[1].apply(meaner, 20, 80).reset_index()
data = pd.concat([data]*10000)
assert np.array_equal(jpp_np(data), jpp_pd(data))
%timeit jpp_np(data) # 11.2 ms per loop
%timeit jpp_pd(data) # 12.5 ms per loop