将 df 与用户定义的函数聚合

2024-01-05

我有一个关于将 pandas 数据帧与用户定义的函数聚合的问题。如果我有一个数据帧并在有或没有 groupby 的情况下运行 agg,则在使用内置函数时会聚合结果。另一方面,如果我使用自定义函数,则在使用 groupby 时它会按预期工作。当不使用 groupby 时,不会进行聚合。有没有一种方法可以在不使用 groupby 并使用自定义函数的情况下进行聚合?我知道可以只添加一个虚拟变量,但这不是首选的解决方案。测试 1-3 按预期工作,但测试 4 不工作。

df = pd.DataFrame(columns=['a', 'b', 'c'])
n=1000
np.random.seed(0)

df['a'] = np.random.rand(n)
df['a'] = np.random.rand(n)
df['c'] = np.random.randint(1, 4, size=n)

def CoV(_s):
    return pd.Series({'CoV' : np.std(_s)/np.mean(_s)})

test1 = df.agg({'a':['std', np.mean]})
print(test1)

test2 = df.groupby(['c']).agg({'a':['std', np.mean]})
print(test2)

test3 = df.groupby(['c']).agg({'a':[CoV]})
print(test3)

# does not work as intended, no aggregation
test4 = df.agg({'a':[CoV]})
print(test4)

这里的答案都没有解决why这是失败的。如果您深入研究 pandas 代码,当 UDF 传递给df.agg,每列的 Series 对象将传递给 UDF。

在您的情况下,使用字典选择 Series 对象(一列),然后将 UDF 传递到 Series 对象的Series.agg功能。因为它不是一个已知的函数(比如字符串'mean'),它最终被传递给Series.apply,它将函数映射到 Series 对象中的每个值。这就是您看到的结果。

幸运的是,UDF 传递给Series.apply发生在一个try/except堵塞。如果无法使用Series.apply(func),它通过以下方式将 Series 对象传递给函数func(Series)。如果传递的对象不是 Series 或 DataFrame,您可以使用它来修改代码以引发错误。

def CoV(_s):
    if not isinstance(_s, (pd.Series, pd.DataFrame, np.array)):
        raise TypeError()
    return pd.Series({'CoV' : np.std(_s)/np.mean(_s)})

现在将其传递给.agg正如您所期望的那样工作。这是一个很棘手的解决方法,但它确实有效。

df.agg({'a': CoV})
# returns:
            a
CoV  0.584645

EDIT:

为了让它与其他功能一起使用,比如'mean',不幸的是,您还必须将它们作为 UDF 传递。更糟糕的是,UDF 的结果累积与内置函数的结果累积不同。 Pandas 只是使用分层列索引水平堆叠它们。一个简单的stack and reset_index解决这个问题。

def check_input(fn):
    def wrapper(_s, *args, **kwargs):
        if not isinstance(_s, (pd.Series, pd.DataFrame, np.array)):
            raise TypeError()
        return fn(_s, *args, **kwargs)
    wrapper.__name__ = fn.__name__
    return wrapper

@check_input
def Mean(_s):
    return pd.Series({'Mean': np.mean(_s)})

@check_input
def CoV(_s):
    return pd.Series({'CoV' : np.std(_s)/np.mean(_s)})

df.agg({'a': [CoV, Mean], 'c': Mean}).stack().reset_index(level=-1, drop=True)
# returns:
             a      c
CoV   0.584645    NaN
Mean  0.511350  2.011
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 df 与用户定义的函数聚合 的相关文章

  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 导入错误:没有名为 _ssl 的模块

    带 Python 2 7 的 Ubuntu Maverick 我不知道如何解决以下导入错误 gt gt gt import ssl Traceback most recent call last File
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • Python 多处理示例不起作用

    我正在尝试学习如何使用multiprocessing但我无法让它发挥作用 这是代码文档 http docs python org 2 library multiprocessing html from multiprocessing imp
  • 为 pandas 数据透视表中的每个值列定义 aggfunc

    试图生成具有多个 值 列的数据透视表 我知道我可以使用 aggfunc 按照我想要的方式聚合值 但是如果我不想对两列求和或求平均值 而是想要一列的总和 同时求另一列的平均值 该怎么办 那么使用 pandas 可以做到这一点吗 df pd D
  • __del__ 真的是析构函数吗?

    我主要用 C 做事情 其中 析构函数方法实际上是为了销毁所获取的资源 最近我开始使用python 这真的很有趣而且很棒 我开始了解到它有像java一样的GC 因此 没有过分强调对象所有权 构造和销毁 据我所知 init 方法对我来说在 py
  • 如何使用装饰器禁用某些功能的中间件?

    我想模仿的行为csrf exempt see here https docs djangoproject com en 1 11 ref csrf django views decorators csrf csrf exempt and h
  • Geopandas 设置几何图形:MultiPolygon“等于 len 键和值”的 ValueError

    我有 2 个带有几何列的地理数据框 我将一些几何图形从 1 个复制到另一个 这对于多边形效果很好 但对于任何 有效 多多边形都会返回 ValueError 请指教如何解决这个问题 我不知道是否 如何 为什么应该更改 MultiPolygon
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • HTTPS 代理不适用于 Python 的 requests 模块

    我对 Python 还很陌生 我一直在使用他们的 requests 模块作为 PHP 的 cURL 库的替代品 我的代码如下 import requests import json import os import urllib impor
  • 如何将 numpy.matrix 提高到非整数幂?

    The 运算符为numpy matrix不支持非整数幂 gt gt gt m matrix 1 0 0 5 0 5 gt gt gt m 2 5 TypeError exponent must be an integer 我想要的是 oct
  • Python:尝试检查有效的电话号码

    我正在尝试编写一个接受以下格式的电话号码的程序XXX XXX XXXX并将条目中的任何字母翻译为其相应的数字 现在我有了这个 如果启动不正确 它将允许您重新输入正确的数字 然后它会翻译输入的原始数字 我该如何解决 def main phon
  • Python - 在窗口最小化或隐藏时使用 pywinauto 控制窗口

    我正在尝试做的事情 我正在尝试使用 pywinauto 在 python 中创建一个脚本 以在后台自动安装 notepad 隐藏或最小化 notepad 只是一个示例 因为我将编辑它以与其他软件一起使用 Problem 问题是我想在安装程序
  • Numpy 优化

    我有一个根据条件分配值的函数 我的数据集大小通常在 30 50k 范围内 我不确定这是否是使用 numpy 的正确方法 但是当数字超过 5k 时 它会变得非常慢 有没有更好的方法让它更快 import numpy as np N 5000
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 对输入求 Keras 模型的导数返回全零

    所以我有一个 Keras 模型 我想将模型的梯度应用于其输入 这就是我所做的 import tensorflow as tf from keras models import Sequential from keras layers imp
  • 在python中,如何仅搜索所选子字符串之前的一个单词

    给定文本文件中的长行列表 我只想返回紧邻其前面的子字符串 例如单词狗 描述狗的单词 例如 假设有这些行包含狗 hotdog big dog is dogged dog spy with my dog brown dogs 在这种情况下 期望
  • 循环标记时出现“ValueError:无法识别的标记样式 -d”

    我正在尝试编码pyplot允许不同标记样式的绘图 这些图是循环生成的 标记是从列表中选取的 为了演示目的 我还提供了一个颜色列表 版本是Python 2 7 9 IPython 3 0 0 matplotlib 1 4 3 这是一个简单的代
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording

随机推荐

  • QObject::connect:无法在 PySide 中对“对象”类型的参数进行排队

    我正在使用 PySide Python Qt 绑定 我有一个 QThread 类的工作线程 它通过信号 槽机制更新主 GUI 线程 更新 QTableWidget 在我的工作线程中 我有以下内容 self emit SIGNAL alter
  • date_create_from_format() 返回错误值。 [复制]

    这个问题在这里已经有答案了 这是我用文字表达月份的简单代码 效果很好 预计二月 回归进行曲 如何解决这个问题 这是 PHP 预定义的函数 是它工作错误还是我使用错误 可能是因为当前的默认日期是 30 日 而
  • 运行插入语句 x 次

    我有两张桌子 一张桌子A有 n 行数据 另一个表B是空的 我想要insert表中的 n 行B 表中每行 1 行A Table B表中会有几个字段A其中 包括表中的外键A 最后我想要一排B对于每一行A 为此 我使用了 INSERT INTO
  • 如何使用 PowerManager 和 PARTIAL_WAKE_LOCK

    我开发了一个小应用程序 这个应用程序必须在设备处于睡眠或深度睡眠状态时始终运行 按右键关闭屏幕 我读了很多关于它的文章 并且都告诉我方法是使用 PowerManager 我的问题是 如果我使用这个命令 我的结构是 gt myActivity
  • System.Web.WebPages 内的 MethodAccessException 将 mvc 3 迁移到 mvc 5

    使用 Visual Studio 2013 我将混合 Asp Net Webforms MVC 3 Framework 4 0 Web 应用程序迁移到 Asp Net Webforms MVC 5 2 2 Framework 4 5 1 我
  • 如何从函数内部的 for 循环退出(转义)函数?

    这是一个理论问题 旨在了解有多少转义 返回或退出 可以应用于嵌套循环或其他控件和函数 我对此感到困惑 因为我被困在代码中如何同时逃离 for 每个循环和方法 https stackoverflow com questions 1557412
  • 将本地分支推送到远程分支

    我在我的 Github 存储库中创建了新存储库 使用 gitpython 库我可以获得这个存储库 然后我创建新分支 添加新文件 提交并尝试推送到新分支 请检查以下代码 import git import random import os r
  • jQuery 将复选框选择转换为数组

    我有一个HTML像这样 div class pgggo list taxon li li div
  • GitHub 操作无法连接到 MongoDB 服务

    我在使用 GitHub 操作运行自动化测试时遇到问题 我不明白为什么我无法连接到运行集成测试的 MongoDB 服务 我尝试了不同的主机 localhost 127 0 0 1 0 0 0 0 但它们都无法连接数据库 它在我的 docker
  • 像 PyCharm/Spyder 一样自动将项目添加到 VS Code 中的 sys.path 吗?

    Problem 在带有子包的 Python 项目中 绝对导入不适用于不在项目根目录中的任何文件 my project my package init py my module py my scripts some script py som
  • 适用于 Windows Phone 8.1 的 PhotoChooserTask 内置裁剪选项

    在 Windows Phone 8 中 我使用 PhotoChooserTask 从手机图库获取图像 当我固定像素宽度和高度时 Windows Phone 会自动启动一个页面来裁剪所选图像 有人可以告诉我如何使用 FileOpenPicke
  • 如何使用JavaScript读取post请求参数

    我正在尝试从 HTML 中读取 post 请求参数 我可以使用 JavaScript 中的以下代码读取获取请求参数 wnd location search 但它不适用于 post 请求 谁能告诉我如何使用 JavaScript 读取 HTM
  • 带有文件内容的.Net资源使docker构建失败

    dotnet build 构建一个没有错误的项目 同时 docker build 给出以下错误 src Audit Worker Example Resources resx error MSB3103 Invalid Resx file
  • Ntext 和 Image 数据类型不能在 WHERE、HAVING、GROUP BY、ON 或 IN 子句中使用

    我收到错误 ntext 和 image 数据类型不能 用于 WHERE HAVING GROUP BY ON 或 IN 子句 除非这些 数据类型与 LIKE 或 IS NULL 谓词 同时尝试 将更改保存到 SQLCE 表 请注意这是一个更
  • jQuery DatePicker:获取选定的日期

    我需要能够从日期选择器中获取选定的日期 并使用选定的值填充另一个文本框 我目前正在使用onClose像这样的函数 defaultDate datepicker onClose function theDate txtEntry1 text
  • Firefox 和 AJAX 文档元素后出现垃圾

    我使用页面获取脚本将网页动态加载到 div 中 这是代码 顺便说一句 我正在使用 Firefox 和 Kubuntu function fetch URL divId req window XMLHttpRequest new XMLHtt
  • 如何在c#中获取图片框上的绘图图形

    我在面板中创建了一个 PictureBox 我在 PictureBox 上画了一些图形 我想通过单击按钮来获取这些图形 我怎样才能做到这一点 Check this http www syncfusion com faq windowsfor
  • 在 Delphi XE5 中生成一个包含数组的示例 JSON

    来自 NET 我一直无法完成我认为简单的任务 我想用TJSONObject TJSONArray TJSONPair等构建一个简单的 JSON 如下所示 APIKEY sadfsafsafdsa UserID 123123123 Trans
  • Moment JS 不包括节假日

    我对 javascript 和 moment js 非常陌生 我正在开发一个网站 我们需要列出产品接下来 5 个可能的提货日期 不包括周末和节假日 我开始使用我在网上找到的一个函数 它可以很好地跳过周末 但我无法让假期工作 任何帮助 将不胜
  • 将 df 与用户定义的函数聚合

    我有一个关于将 pandas 数据帧与用户定义的函数聚合的问题 如果我有一个数据帧并在有或没有 groupby 的情况下运行 agg 则在使用内置函数时会聚合结果 另一方面 如果我使用自定义函数 则在使用 groupby 时它会按预期工作