我想做一个很好的函数来聚合数组中的数据(它是一个 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/