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

问题描述 投票:1回答:2

我有一个熊猫数据框,我想针对该数据框按簇计算中位数绝对偏差。我假设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的新列?

提前感谢

托马斯·飞利浦

python-3.x pandas dataframe pandas-groupby
2个回答
2
投票

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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.