在pandas和numpy中聚合lambda函数

use*_*994 8 python lambda numpy pandas

我有一个汇总声明如下:

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())})
Run Code Online (Sandbox Code Playgroud)

我继续得到关键错误.我已经能够使它适用于一个lambda函数而不是两个.

unu*_*tbu 18

您需要指定data要聚合其值的列.例如,

data = data.groupby(['type', 'status', 'name'])['value'].agg(...)
Run Code Online (Sandbox Code Playgroud)

代替

data = data.groupby(['type', 'status', 'name']).agg(...)
Run Code Online (Sandbox Code Playgroud)

如果你没有提到列(例如'value'),那么传递给dict的键将agg被视为列名.这KeyError是Pandas告诉你它无法找到命名的列one,two或者test2在DataFrame中的方式data.

注意:groupby/agg已弃用传递dict .相反,前进你应该传递一个元组列表.每个元组都应该是这种形式('new_column_name', callable).


这是runnable示例:

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
# ...
Run Code Online (Sandbox Code Playgroud)

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

  • @ Sometimes24:你是否将函数列表传递给`groupby/agg`?如果是这样,请传递一个元组列表.我已经更新了上面的代码以显示我的意思.如果这不是您的情况,那么请打开一个包含所有细节的新问题(具有所需输出的可运行示例有很多帮助.) (3认同)
  • 当我遵循上面的示例时,列名称称为<lambda>。您知道如何添加自定义名称吗? (2认同)