docs: def apply_and_name(self, aggregator):
          """Fetches the row-aggregated input columns for this ColumnFunction.
  
          Args:
              aggregator (Aggregator)
  
          Returns:
              pd.DataFrame: The dataframe has columns with names self.names
                  that were created by this ColumnFunction,
                  and is indexed by the index that was passed to
                  aggregator.aggregate(index).
          """
          reduced_df = self._apply(aggregator)
          if len(self.names) != len(reduced_df.columns):
              raise IndexError("ColumnFunction creates more columns than it has names for.")
          reduced_df.columns = self.names
          return reduced_df