首页 > 解决方案 > 在 Pandas `transform()` 中使用自定义函数(中值绝对偏差)

问题描述

我有一个 pandas 数据框,我想按集群计算 MEDIAN Absolute Deviation。我假设 pandas 方法mad是中值绝对偏差,但它似乎是平均绝对偏差。我写的代码行是

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('mad')

我尝试编写自己的一个小函数来计算中值绝对偏差

def myMAD(x):
    med = np.median(x)
    x   = abs(x-med)
    MAD = np.median(x)
    return MAD

并将我的代码更改为阅读

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('myMAD')

不幸的是,这不起作用。我得到一个 AttributeError 'SeriesGroupBy' 对象没有属性 'myMAD'。

如何按集群计算数据框中列的中值绝对偏差,并使用转换正确地跨行广播 MAD 创建新列?

提前致谢

托马斯飞利浦

标签: python-3.xpandasdataframepandas-groupby

解决方案


你很接近,需要myMAD相反,'myMAD'因为你的自定义功能:

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform(myMAD)

编辑:

如果没有按列分组的辅助列,您的解决方案是可能的df['Cluster']

s1 = df.groupby('Cluster')['PPGamp'].transform('median')
s2 = df['PPGamp'].sub(s1).abs()

df['MAD PPGamp'] = s2.groupby(df['Cluster']).transform('median')

推荐阅读