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

Tho*_*ips 5 dataframe python-3.x pandas pandas-groupby

我有一个 pandas 数据框,我想按簇计算其中值绝对偏差。我假设 pandas 方法mad是中值绝对偏差,但看起来它是平均绝对偏差。我写的代码行是

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('mad')
Run Code Online (Sandbox Code Playgroud)

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

def myMAD(x):
    med = np.median(x)
    x   = abs(x-med)
    MAD = np.median(x)
    return MAD
Run Code Online (Sandbox Code Playgroud)

并更改我的代码以读取

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform('myMAD')
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢

托马斯·飞利浦

jez*_*ael 3

你很接近,需要myMAD代替,'myMAD'因为你的自定义函数:

df['MAD PPGamp'] = df.groupby('Cluster')['PPGamp'].transform(myMAD)
Run Code Online (Sandbox Code Playgroud)

编辑:

您的解决方案无需按列分组的辅助列即可df['Cluster']

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

df['MAD PPGamp'] = s2.groupby(df['Cluster']).transform('median')
Run Code Online (Sandbox Code Playgroud)