code: def aggregate_grouploop(*args, **kwargs):
      
      extrafuncs = {'allnan': allnan, 'anynan': anynan,
                    'first': itemgetter(0), 'last': itemgetter(-1),
                    'nanfirst': nanfirst, 'nanlast': nanlast}
      func = kwargs.pop('func')
      func = extrafuncs.get(func, func)
      if isinstance(func, str):
          raise NotImplementedError("Grouploop needs to be called with a function")
      return aggregate_numpy.aggregate(*args, func=lambda x: func(x), **kwargs)
docs: wraps func in lambda which prevents aggregate_numpy from
      recognising and optimising it. Instead it groups and loops.