python-3.x - 在 Pandas `transform()` 中使用自定义函数(中值绝对偏差)
问题描述
我有一个 pandas 数据框,我想按集群计算 MEDIAN Absolute Deviation。我假设 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 创建新列?
提前致谢
托马斯飞利浦
解决方案
你很接近,需要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')
推荐阅读
- salesforce-commerce-cloud - 如何从 Salesforce Commerce Cloud 商店首页进行 REST API 调用?
- emacs - 如何在 emacs 中记录拼写替换?
- html - 表格的 4 个步骤的圆形进度条
- printf - 无法在 shell 脚本中使用 printf 命令切换用户
- flutter - 如何在堆栈层中打一个洞或如何复制所示的设计
- javascript - Node JS - 循环 JSON 和映射值
- sql - SQL - 按创建的与另一个时间戳列相关的时间戳选择最近的行
- arrays - 来自 pyspark.sql.dataframe.DataFrame 的 numpy 转换为字符串数组
- java - Spring Security 登录总是重定向到 failureUrl
- docker - docker-compose up 无法启动容器服务之一