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

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函数,但不适用于两个。

最佳答案

您需要在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
# ...

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

关于python - 在pandas和numpy中聚合lambda函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30718231/

10-09 21:26