【问题标题】:DataFrame.groupby.agg(list) works but not agg('list')DataFrame.groupby.agg(list) 有效,但 agg('list') 无效
【发布时间】:2020-05-26 21:30:09
【问题描述】:

我试图在 Pandas 中应用 listagg 在 SQL 中所做的操作

为什么以下工作

DataFrame.groupby.agg(list) 

但以下没有?

DataFrame.groupby.agg('list')

我正在转换以下数据:

【问题讨论】:

  • 请注意分享您的数据和代码,以便我们了解您尝试复制的内容
  • 我的猜测是list 是一个可以应用于项目集合的函数。 'list' 是一个字符串。如果它是一个字符串,pandas 会检查预定义函数的列表,例如 'mean''std''list' 不在此预定义函数列表中。您可以将自己的函数传递给agg(),这也应该可以工作
  • @sammywemmy 我用我正在处理的数据的屏幕截图编辑了帖子

标签: python pandas pandas-groupby


【解决方案1】:
  • 如果.agg() 方法的参数是函数的名称(即不是带有名称的字符串),它必须是Python 的已知名称, 一世。 e.标准的、导入的或您自己的函数。
    (在您的情况下,list 是标准 Python 函数。)

     

  • 如果.agg()方法的参数是字符串,那么pandas

    1. 使用GroupBy 类的方法,如果存在该名称的方法
      (在您的情况下,GroupBy 类没有 .list() 方法),
    2. 使用具有此类名称的 NumPy 函数,如果具有此类名称的函数存在 (在你的情况下,没有函数numpy.list()

如您所见,如果参数是字符串,Pandas 会忽略 Python 已知的函数。

【讨论】:

    【解决方案2】:

    看了一下pandas源码发现,至少在聚合一个pandas系列的时候,字符串函数名是通过调用“翻译”成函数的

    if isinstance(func, str):
        return getattr(self, func)(*args, **kwargs)
    

    其中selfSeriesGroupBy 的一个实例,它是GroupBy 的子类。 GroupBy 类有许多用于聚合的方法(包括countmeanmedian 等)。另一方面,list 当然不是GroupBy 的方法,而是一个内置的Python 函数,所以调用getattr() 时找不到它。我认为DataFrameGroupBy 也是如此,因为它也是GroupBy 的子类。

    以类似的方式,.agg() 在以字符串形式提供时将无法使用任何用户定义的函数名称。

    如需提供给.agg() 的所有可用字符串列表,请查看this article in the pandas documentation

    【讨论】:

      猜你喜欢
      • 2018-02-06
      • 2018-01-10
      • 2023-03-21
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多