code: def convert(self, df: pd.DataFrame) -> pd.DataFrame:
      df = df.copy()
      if self.hem_column is None:
          df[self.HEM_COLUMN_NAME] = df[self.email_column].apply(
              self._email_to_hem
          )
          if df[self.HEM_COLUMN_NAME].isna().all():
              msg = bundle.get("all_emails_invalid").format(
                  self.email_column
              )
              print(msg)
              self.logger.warning(msg)
              df = df.drop(columns=self.HEM_COLUMN_NAME)
              del self.search_keys[self.email_column]
              return df
          self.search_keys[self.HEM_COLUMN_NAME] = SearchKey.HEM
          self.email_converted_to_hem = True
  
      del self.search_keys[self.email_column]
  
      df[self.EMAIL_ONE_DOMAIN_COLUMN_NAME] = df[
          self.email_column
      ].apply(self._email_to_one_domain)
  
      self.search_keys[
          self.EMAIL_ONE_DOMAIN_COLUMN_NAME
      ] = SearchKey.EMAIL_ONE_DOMAIN
  
      df[self.DOMAIN_COLUMN_NAME] = df[
          self.EMAIL_ONE_DOMAIN_COLUMN_NAME
      ].str[1:]
      self.generated_features.append(self.DOMAIN_COLUMN_NAME)
  
      return df
  
file_path: upgini/src/upgini/utils/email_utils.py
imports: import logging
  import re
  from hashlib import sha256
  from typing import Dict, List, Optional
  import pandas
  from pandas.api.types import is_string_dtype
  from upgini.resource_bundle import bundle
  from upgini.metadata import SearchKey
  from upgini.utils.base_search_key_detector import BaseSearchKeyDetector
label_desc: Use image node_id 4 for calling the EmailSearchKeyConverter obj's underlying member method code with example usage: obj.convert(df) and returns: df, df