【问题标题】:Calculations within pandas aggregatepandas 聚合中的计算
【发布时间】:2015-08-11 09:05:31
【问题描述】:

我正在尝试在 pandas 聚合中执行计算。我希望计算包含在聚合中。我正在尝试的代码如下。我也在为 df 使用 pandas 包。

data = data.groupby(['type', 'name']).agg({'values': [np.min, np.max, 100 * sum([('values' > 3200)] / [np.size])]})

我要计算的公式如下:

100 * sum((values > 3200) / (np.size))

这里 np 是聚合的大小(聚合的数字仅限于 > 3200 的数字)。如何在聚合中执行这样的计算会有很大帮助。

示例输入数据(实际数据集要大得多)。重复值是由于聚合造成的。

type, name, values
apple, blue, 2500
orange, green, 2800
peach, black, 3300
lemon, white, 3500

所需的示例输出(由于我尚未能够执行计算,数字不正确):

type, name, values, np.min, np.max, calcuation
apple, blue, 2500, 1200, 40000, 2300
orange, green, 2800, 1200, 5000, 2500

【问题讨论】:

  • 您能对您的用例进行更多描述吗?例如输入数据和期望的输出,我认为在这种情况下提到“聚合”可能会造成混淆。
  • 一个小的工作 sn-p 将有助于了解您正在尝试做什么。
  • 数据已更新。其余代码只是从数据库中简单提取并放入 pandas df
  • 你显示示例数据,但不输出数据。需要更多的叙述
  • 现在应该更清楚了

标签: python numpy pandas


【解决方案1】:

您需要定义作用于组的函数,为您提供大于 3200 的值的百分比,并将其与其他函数一起传递给 .agg

func = lambda series: 100* (series > 3200).mean(); 
data.groupby(['type', 'name']).values.agg({'min': min, 'max': max, 'calculation': func})

布尔向量的平均值给出了真值的百分比,这是一种更好的计算方法。此外,您可以将常用函数名称(例如 min 和 max)作为字符串传递。

【讨论】:

    【解决方案2】:

    传递 df.agg 一个字典用于指定输出列的名称,在这里,您实际上是在编写一个聚合函数,它试图对一个命名列使用三个公式,并且该列已经在您的数据框中,所以它会失败。

    你应该做的应该看起来更像:

    data = data.groupby(['type', 'name']).agg({'min':np.min, 'max':np.max, 'calculation': calculation})
    

    您将计算函数重写为 lambda 或自定义函数的位置,具体取决于您想要如何做事。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 2019-06-19
    • 1970-01-01
    • 2019-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多