【问题标题】:How do I define pandas.groupby aggregation functions when some columns are aggregated by "describe" and others by various other aggregators?当某些列由“描述”聚合而其他列由各种其他聚合器聚合时,如何定义 pandas.groupby 聚合函数?
【发布时间】:2019-10-07 16:11:23
【问题描述】:

我正在尝试从批量生产过程中汇总来自各种传感器的数据,以便使用 pandas.groupby().agg({}) 函数将其与最终产品相匹配。

为了方便起见,因为我们还不确定如何最好地总结某些属性,所以我想对某些属性使用“描述”功能。其他属性需要几个聚合函数,例如['最小','最大']。

问题在于,当在同一个字典中提供时,pandas 似乎无法在同一个分组操作中执行这两个操作。

小例子:

df = pd.DataFrame({'Sensor_1': [1, 2, 3, 4, 5, 6, 5, 4, 3, 3, 2], 
'Sensor_2': [2, 2, 3, 3, 7, 6, 9, 2, 2, 1, 1], 
'Batch': [1, 1, 1, 2, 1, 2, 1, 2, 2, 2, 2]})

我现在可以使用 groupby 运算符执行以下分组:

df.groupby('Batch').agg({'Sensor_1': 'mean',
                        'Sensor_2': 'describe'})

我也可以像这样分组:

df.groupby('Batch').agg({'Sensor_1': ['mean', 'min'],
                        'Sensor_2': 'max'})

但是,定义如下:

df.groupby('Batch').agg({'Sensor_1': ['mean', 'min'],
                        'Sensor_2': 'describe'})

引发以下错误:

TypeError: 无法连接“class 'dict'”类型的对象;只有 pd.Series、pd.DataFrame 和 pd.Panel(已弃用)obj 有效

有谁知道为什么会发生这种情况以及如何解决这个问题?

我将 Jupyter Hub 与 Python 3.6.8 和 Pandas 版本 0.23.0 一起使用

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    你可以做什么基本上通过定义一个分位数函数来给出describe方法的所有功能

    def quant(n):
        def quantile_(x):
            return np.quantile(x, n)
        quantile_.__name__ = 'quantile_%s' % n
        return quantile_
    

    然后就是:

    df.groupby("Batch").agg({"Sensor_1": ['mean', 'min'], 
                             "Sensor_2": ['std', 'min', quant(.25), quant(.50), quant(.75), 'max']})
    

    希望对你有帮助:)

    【讨论】:

    • 您好 Jules,感谢您的建议。但是,我真的很想了解它为什么不起作用...
    • <rant>它不起作用仅仅是因为agg 和错误并且不遵循其文档</rant>。更严重的是,agg 有 3 种类型的 函数:内部表示应用于 nd.arrays 或 Series 的方法,外部(例如用户提供的 Python 函数)将 Series 作为参数传递,以及describe 代表一堆内部函数。同时,agg 接受各种参数:单个函数、函数列表或将它们映射到轴标签的字典。角落案例处理不当并不奇怪
    猜你喜欢
    • 2018-04-20
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多