我有一个熊猫数据框,我想针对该数据框按簇计算中位数绝对偏差。我假设pandas方法mad
是中值绝对偏差,但看来它是MEAN绝对偏差。我编写的代码行是
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的新列?
提前感谢
托马斯·飞利浦
您很近,需要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内部的)函数应用于数据框的列。