code: def call(self, step):
      # used only in join of two regular tables
      step_data = self.steps_data[step.dataframe.step_num]
  
      df = step_data.to_df()
  
      query = Select(
          targets=step.targets, from_table="df", group_by=step.columns
      ).to_string()
      res = query_df(df, query)
  
      # stick all columns to first table
      appropriate_table = step_data.get_tables()[0]
  
      data = ResultSet()
  
      data.from_df(
          res,
          appropriate_table["database"],
          appropriate_table["table_name"],
          appropriate_table["table_alias"],
      )
  
      # columns are changed
      self.set_columns_list(data.columns)
      return data
  
imports: import pandas
  from mindsdb_sql.parser.ast import Identifier, Select, Star
  from mindsdb_sql.planner.steps import LimitOffsetStep, FilterStep, GroupByStep, DataStep
  from mindsdb_sql.planner.utils import query_traversal
  from mindsdb.api.executor.sql_query.result_set import ResultSet
  from mindsdb.api.executor.utilities.sql import query_df
  from mindsdb.api.executor.exceptions import KeyColumnDoesNotExist, NotSupportedYet
  from mindsdb.interfaces.query_context.context_controller import query_context_controller
  from .base import BaseStepCall
label_desc: Use image node_id 1 for calling the GroupByStepCall obj's underlying member method code with example usage: obj.call(step) and returns: data