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)
如果这与您的情况不符,请提供可执行的可运行代码.