docstr: Crop the frame given the bbox - Crop(frame, bbox)
  If one of the side of the crop box is 0, it automatically sets it to 1 pixel
  
  Returns:
      ret (pd.DataFrame): The cropped frame.
docstr_tok: ["Crop","the","frame","given","the","bbox","-","Crop","(","frame",",","bbox",")","If","one","of","the","side","of","the","crop","box","is","0",",","it","automatically","sets","it","to","1","pixel","Returns",":","ret","(","pd.DataFrame",")",":","The","cropped","frame","."]
code: def forward(self, df: pd.DataFrame) -> pd.DataFrame:
      """
      Crop the frame given the bbox - Crop(frame, bbox)
      If one of the side of the crop box is 0, it automatically sets it to 1 pixel
  
      Returns:
          ret (pd.DataFrame): The cropped frame.
      """
  
      def crop(row: pd.Series) -> np.ndarray:
          row = row.to_list()
          frame = row[0]
          bboxes = row[1]
  
          x0, y0, x1, y1 = np.asarray(bboxes, dtype="int")
          # make sure the bbox is valid
          x0 = max(0, x0)
          y0 = max(0, y0)
  
          if x1 == x0:
              x1 = x0 + 1
  
          if y1 == y0:
              y1 = y0 + 1
  
          return frame[y0:y1, x0:x1]
  
      ret = pd.DataFrame()
      ret["cropped_frame_array"] = df.apply(crop, axis=1)
      return ret
  
imports: import numpy
  import pandas
  from evadb.functions.abstract.abstract_function import AbstractFunction
label_desc: Use image node_id 3 for calling the Crop obj's underlying member method code with example usage: obj.forward(df) and returns: ret, frame