@@ -423,7 +423,6 @@ def _aggregate(self, arg, *args, **kwargs):
423423 if isinstance (arg , compat .string_types ):
424424 return getattr (self , arg )(* args , ** kwargs ), None
425425
426- result = compat .OrderedDict ()
427426 if isinstance (arg , dict ):
428427
429428 # aggregate based on the passed dict
@@ -483,22 +482,33 @@ def _agg_2dim(name, how):
483482 subset = obj )
484483 return colg .aggregate (how , _level = None )
485484
485+ def _agg (arg , func ):
486+ """
487+ run the aggregations over the arg with func
488+ return an OrderedDict
489+ """
490+ result = compat .OrderedDict ()
491+ for fname , agg_how in compat .iteritems (arg ):
492+ result [fname ] = func (fname , agg_how )
493+ return result
494+
486495 # set the final keys
487496 keys = list (compat .iterkeys (arg ))
497+ result = compat .OrderedDict ()
488498
489499 # nested renamer
490500 if is_nested_renamer :
491- results = [ _agg_1dim ( k , v ) for k , v in compat . iteritems ( arg )]
501+ result = list ( _agg ( arg , _agg_1dim ). values ())
492502
493- if all (isinstance (r , dict ) for r in results ):
503+ if all (isinstance (r , dict ) for r in result ):
494504
505+ result , results = compat .OrderedDict (), result
495506 for r in results :
496507 result .update (r )
497508 keys = list (compat .iterkeys (result ))
498509
499510 else :
500511
501- result = results
502512 if self ._selection is not None :
503513 keys = None
504514
@@ -511,27 +521,29 @@ def _agg_2dim(name, how):
511521 # but may have multiple aggregations
512522 if len (sl ) == 1 :
513523
514- for fname , agg_how in compat .iteritems (arg ):
515- result [fname ] = _agg_1dim (self ._selection ,
516- agg_how )
524+ result = _agg (arg , lambda fname ,
525+ agg_how : _agg_1dim (self ._selection , agg_how ))
517526
518527 # we are selecting the same set as we are aggregating
519528 elif not len (sl - set (compat .iterkeys (arg ))):
520529
521- for fname , agg_how in compat .iteritems (arg ):
522- result [fname ] = _agg_1dim (fname , agg_how )
530+ result = _agg (arg , _agg_1dim )
523531
524532 # we are a DataFrame, with possibly multiple aggregations
525533 else :
526534
527- for fname , agg_how in compat .iteritems (arg ):
528- result [fname ] = _agg_2dim (fname , agg_how )
535+ result = _agg (arg , _agg_2dim )
529536
530537 # no selection
531538 else :
532539
533- for col , agg_how in compat .iteritems (arg ):
534- result [col ] = _agg_1dim (col , agg_how )
540+ try :
541+ result = _agg (arg , _agg_1dim )
542+ except SpecificationError :
543+
544+ # we are aggregating expecting all 1d-returns
545+ # but we have 2d
546+ result = _agg (arg , _agg_2dim )
535547
536548 # combine results
537549 if isinstance (result , list ):
0 commit comments