计算 MAD(平均绝对偏差) GroupBy Pandas

Posted

技术标签:

【中文标题】计算 MAD(平均绝对偏差) GroupBy Pandas【英文标题】:Computing MAD(mean absolute deviation) GroupBy Pandas 【发布时间】:2015-07-03 00:12:44 【问题描述】:

我有一个数据框:

Type Name Cost
  A   X    545
  B   Y    789
  C   Z    477
  D   X    640
  C   X    435
  B   Z    335
  A   X    850
  B   Y    152

我的数据框中有所有此类组合,类型为 ['A','B','C','D'] 和名称 ['X','Y','Z'] 。我使用 groupby 方法来获取特定组合的统计信息,例如 A-X 、 A-Y 、 A-Z 。这是一些代码:

df = pd.DataFrame('Type':['A','B','C','D','C','B','A','B'] ,'Name':['X','Y','Z','X','X','Z','X','Y'], 'Cost':[545,789,477,640,435,335,850,152])
df.groupby(['Name','Type']).agg([mean,std])  
#need to use mad instead of std  

我需要消除超过 3 MADs 之外的观察结果;类似:

test = df[np.abs(df.Cost-df.Cost.mean())<=(3*df.Cost.mad())]

我对此感到困惑,因为 df.Cost.mad() 返回整个数据而不是特定类型名称类别的成本的 MAD。我怎么能把两者结合起来?

【问题讨论】:

【参考方案1】:

您可以使用groupbytransform 创建可用于过滤数据的新数据系列。

groups = df.groupby(['Name','Type'])
mad = groups['Cost'].transform(lambda x: x.mad())
dif = groups['Cost'].transform(lambda x: np.abs(x - x.mean()))
df2 = df[dif <= 3*mad]

但是,在这种情况下,不会过滤掉任何行,因为差值等于平均绝对偏差(组最多只有两行)。

【讨论】:

谢谢,你的答案和 unutbu 的答案是一样的,虽然你的更紧凑。最后一行有错字,应该以方括号结尾。谢谢!!【参考方案2】:

您可以在分组对象上获取聚合函数:

df["mad"] = df.groupby(['Name','Type'])["Cost"].transform("mad")
df = df.loc[df.mad<3]

【讨论】:

以上是关于计算 MAD(平均绝对偏差) GroupBy Pandas的主要内容,如果未能解决你的问题,请参考以下文章

SQL 平均绝对偏差

R语言mad函数median函数mean函数计算中位数绝对偏差中位数均值实战

python使用statsmodels包中的robust.mad函数计算数组(Array)的中位数绝对偏差(MADMedian Absolute Deviation)

python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)

Python 详解计算 Median Absolute Deviation(绝对中位偏差)| 还可用于异常值检测

Python 详解计算 Median Absolute Deviation(绝对中位偏差)| 还可用于异常值检测