python - 通过仅考虑百分位数范围内的值来估计 DataFrameGroupBy 的平均值

标签 python pandas dataframe group-by pandas-groupby

我需要通过仅考虑给定百分位范围之间的值来估计 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

关于python - 通过仅考虑百分位数范围内的值来估计 DataFrameGroupBy 的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53277378/

相关文章:

python - 如何忽略列表中的高偏差

python - 使用 Pandas 进行数据操作

python - 在 pandas 中,如何从字典列表创建数据框?

python - 如何在 TensorFlow 2.0 中组合两个渐变带

python - Flask-Admin 模型 View 配置

Python - 特殊字符产生不同的 CRC 结果

Python 使用 drop() 方法?

python - 将 pandas 数据框列从带逗号的字符串转换为带点的 float 时出错

python - 如何将 Pandas 中的单个时间序列转换为多个序列

pandas - 当我将 Pandas 系列插入数据框时,所有值都变为 NaN