在 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 中的键将被视为列名。 KeyError
s 是 Pandas 告诉您在 DataFrame data
中找不到名为 one
、two
或 test2
的列的方式。
注意:将字典传递给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
# ...
如果这不符合您的情况,那么请提供符合的可运行代码。
【讨论】:
按照上面的例子,列名被称为groupby/agg
?如果是这样,请改为传递一个元组列表。我已经更新了上面的代码以显示我的意思。如果这不是您的情况,那么请打开一个包含所有详细信息的新问题(具有所需输出的可运行示例很有帮助。)以上是关于在 pandas 和 numpy 中聚合 lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章