在Pandas"transform()"中使用自定义函数(中值绝对偏差)



我有一个pandas数据帧,我想按集群计算其MEDIAN绝对偏差。我假设Panda方法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的新列?

提前感谢

Thomas Philips

您很接近,需要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')

我找到了一个两步解决问题的方法:

df['Abs Delta PPGamp']  = abs(df['PPGamp'] - df['Med PPGamp'])
df['MAD PPGamp'] = df.groupby('Cluster')['Abs Delta PPGamp'].transform('median')

然后,我可以重申我的问题:当使用groupby时,我如何将任何(合理的(用户定义的(甚至Python内部的(函数应用于数据帧的列。

最新更新