Group aggregate #1546

@taldcroft please have a look at the changes. Also here is a comparison of np.sum and np.add.reduceat.
![comparison](https://cloud.githubusercontent.com/assets/5782112/3280724/346b350a-f479-11e3-9f7f-d364b806d2b4.png)

I think you can simplify the logic by just resetting the function here:
```
if func is np.sum:
    func = np.add
```
Then the new `func` will have `reduceat`.