在 pandas 和 numpy 中聚合 lambda 函数

Posted

技术标签:

【中文标题】在 pandas 和 numpy 中聚合 lambda 函数【英文标题】:Aggregating lambda functions in pandas and numpy 【发布时间】:2015-08-23 10:56:26 【问题描述】:

我在下面有一个聚合语句:

data = data.groupby(['type', 'status', 'name']).agg('one' : np.mean, 'two' : lambda value: 100* ((value>32).sum() / reading.mean()), 'test2': lambda value: 100* ((value > 45).sum() / value.mean()))

我继续遇到关键错误。我已经能够使它适用于一个 lambda 函数,但不是两个。

【问题讨论】:

【参考方案1】:

您需要在data 中指定要聚合其值的列。 例如,

data = data.groupby(['type', 'status', 'name'])['value'].agg(...)

而不是

data = data.groupby(['type', 'status', 'name']).agg(...)

如果您没有提及该列(例如'value'),则传递给agg 的dict 中的键将被视为列名。 KeyErrors 是 Pandas 告诉您在 DataFrame data 中找不到名为 onetwotest2 的列的方式。

注意:将字典传递给groupby/agg 已被弃用。相反,您应该改为传递一个元组列表。每个元组都应采用('new_column_name', callable) 的形式。


这是可运行的示例:

import numpy as np
import pandas as pd

N = 100
data = pd.DataFrame(
    'type': np.random.randint(10, size=N),
    'status': np.random.randint(10, size=N),
    'name': np.random.randint(10, size=N),
    'value': np.random.randint(10, size=N),
)

reading = np.random.random(10,)

data = data.groupby(['type', 'status', 'name'])['value'].agg(
    [('one',  np.mean), 
    ('two', lambda value: 100* ((value>32).sum() / reading.mean())), 
    ('test2', lambda value: 100* ((value > 45).sum() / value.mean()))])
print(data)
#                   one  two  test2
# type status name                 
# 0    1      3     3.0    0    0.0
#             7     4.0    0    0.0
#             9     8.0    0    0.0
#      3      1     5.0    0    0.0
#             6     3.0    0    0.0
# ...

如果这不符合您的情况,那么请提供符合的可运行代码。

【讨论】:

按照上面的例子,列名被称为。你知道如何添加自定义名称吗? @sometimes24:您是否将函数列表传递给groupby/agg?如果是这样,请改为传递一个元组列表。我已经更新了上面的代码以显示我的意思。如果这不是您的情况,那么请打开一个包含所有详细信息的新问题(具有所需输出的可运行示例很有帮助。)

以上是关于在 pandas 和 numpy 中聚合 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

pandas 笔记:聚合函数agg

pandas agg函数使用方法

Pandas

笔记进行目录

认识pandas

re模块和numpy模块