在pandas和numpy中聚合lambda函数

时间:2015-06-08 20:12:47

标签: python numpy pandas lambda

我在下面有一个汇总声明:

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 个答案:

答案 0 :(得分:14)

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

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

而不是

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

如果您未提及该列(例如'value'),则传递给agg的dict中的键将被视为列名。 KeyError是Pandas告诉您无法在DataFrame one中找到名为twotest2data的列的方式。

注意:已弃用将dict传递给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
# ...

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