【问题标题】:Use custom function (Median Absolute Deviation) in Pandas `transform()`在 Pandas `transform()` 中使用自定义函数(中值绝对偏差)
【发布时间】:2020-08-09 16:19:52
【问题描述】:

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

提前致谢

托马斯·飞利浦

【问题讨论】:

  • 我建议使用已经实现的 scipy.stats.median_absolute_deviation

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

你很亲密,需要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')

【讨论】:

  • 感谢磨坊 - 我在写我的两步解决方案时错过了看到这个!
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多