聚合数组的 pythonic 方式(numpy 与否)

标签 python arrays numpy aggregate

我想做一个很好的函数来聚合数组中的数据(它是一个 numpy 记录数组,但它不会改变任何东西)

你有一组数据,你想在一个轴上聚合:例如 dtype=[(name, (np.str_,8), (job, (np.str_,8) , (income, np.uint32)] 并且您想获得每份工作的平均收入

我做了这个函数,在例子中它应该被调用为 aggregate(data,'job','income',mean)


def aggregate(data, key, value, func):

    data_per_key = {}

    for k,v in zip(data[key], data[value]):

        if k not in data_per_key.keys():

            data_per_key[k]=[]

        data_per_key[k].append(v)

    return [(k,func(data_per_key[k])) for k in data_per_key.keys()]

问题是我觉得它不太好我想把它放在一行中:你有什么想法吗?

谢谢你的回答路易斯

PS:我想在调用中保留函数,这样你也可以要求中位数、最小值......

最佳答案

也许您正在寻找的功能是matplotlib.mlab.rec_groupby :

import matplotlib.mlab

data=np.array(
    [('Aaron','Digger',1),
     ('Bill','Planter',2),
     ('Carl','Waterer',3),
     ('Darlene','Planter',3),
     ('Earl','Digger',7)],
    dtype=[('name', np.str_,8), ('job', np.str_,8), ('income', np.uint32)])

result=matplotlib.mlab.rec_groupby(data, ('job',), (('income',np.mean,'avg_income'),))

产量

('Digger', 4.0)
('Planter', 2.5)
('Waterer', 3.0)

matplotlib.mlab.rec_groupby 返回一个 recarray:

print(result.dtype)
# [('job', '|S7'), ('avg_income', '<f8')]

您可能也有兴趣查看 pandas ,它甚至有 more versatile facilities处理 group-by operations .

关于聚合数组的 pythonic 方式(numpy 与否),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1829340/

相关文章:

python - 迭代时如何获取 2D Numpy 数组中的位置?

Python OpenCV : Crop image to contents,并使背景透明

python Pandas : Get 2 set of random samples per group

javascript - JavaScript 中使用 Wea​​kMap 的多个私有(private)属性

ruby - 向数组添加哈希?

java - 将文件读取到字符串数组并显示每条记录

python - 有没有一种好方法可以在特征 p>0 的字段中找到矩阵的秩?

python - 如何将 ISO 8601 日期时间字符串转换为 Python 日期时间对象?

python - Pyramid 应用程序中的基本/摘要 HTTP 身份验证

python - 过滤表单内的查询集