我有一个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内部的(函数应用于数据帧的列。