class_docstr: The base evaluator defines a simple evaluations that iterates through
  subjects and computes each metric in sequence
  
  Sub-classes should overload the default_evaluation_list with
  application-specific metrics
  If a particular ordering of computations per subject is needed, sub-class
  can override the evaluate_next method; if a particular ordering of
  subjects is needed, subclasses can override the evaluate method.
class_docstr_tok: ["The","base","evaluator","defines","a","simple","evaluations","that","iterates","through","subjects","and","computes","each","metric","in","sequence","Sub-classes","should","overload","the","default_evaluation_list","with","application-specific","metrics","If","a","particular","ordering","of","computations","per","subject","is","needed",",","sub-class","can","override","the","evaluate_next","method",";","if","a","particular","ordering","of","subjects","is","needed",",","subclasses","can","override","the","evaluate","method","."]
docstr: Apply all of the iterations requested by the evaluations
  
  :param dataframes: a list of pandas.DataFrame objects
  :return: a dictionary of pandas.DataFrame objects after aggregation
docstr_tok: ["Apply","all","of","the","iterations","requested","by","the","evaluations",":","param","dataframes",":","a","list","of","pandas.DataFrame","objects",":","return",":","a","dictionary","of","pandas.DataFrame","objects","after","aggregation"]
code: def aggregate(self, dataframes):
      """
      Apply all of the iterations requested by the evaluations
  
      :param dataframes: a list of pandas.DataFrame objects
      :return: a dictionary of pandas.DataFrame objects after aggregation
      """
      result_dict = defaultdict(lambda: pd.DataFrame())
      for pdf in dataframes:
          key = tuple(pdf.index.names)
          result_dict[key] = (
              pdf
              if key not in result_dict
              else result_dict[key].combine_first(pdf)
          )
  
      aggregations = []
      for evaluation in self.evaluations:
          agg_list = evaluation.get_aggregations()
          aggregations.extend(agg_list)
      for aggregation in aggregations:
          for pdf in aggregation(result_dict):
              key = tuple(pdf.index.names)
              result_dict[key] = (
                  pdf
                  if key not in result_dict
                  else result_dict[key].combine_first(pdf)
              )
      return result_dict
  
imports: from __future__ import absolute_import, division, print_function
  import itertools
  from itertools import groupby
  from collections import defaultdict
  import pandas
  from niftynet.engine.application_factory import EvaluationFactory
  from niftynet.utilities.util_common import cache
label_desc: Use image node_id 5 for calling the BaseEvaluator obj's underlying member method code with example usage: obj.aggregate(dataframes) and returns: result_dict