code: def evaluate(self, data, env):
          
          # For each predicate-value, we keep track of the positions
          # that have been copied to the result, so that the later
          # more general values do not overwrite the previous ones.
          result = np.repeat(None, len(data))
          copied = np.repeat(False, len(data))
          for pred_expr, value_expr in self.pv_expressions:
              bool_idx = pred_expr.evaluate(data, env)
              if not pdtypes.is_bool_dtype(np.asarray(bool_idx)):
                  raise TypeError(
                      "The predicate keys must return a boolean array, "
                      "or a boolean value.")
              value = value_expr.evaluate(data, env)
              mask = (copied ^ bool_idx) & bool_idx
              copied |= bool_idx
              idx = np.where(mask)[0]
              result[idx] = self.nice_value(value, idx)
          return np.array(list(result))
docs: Evaluate the predicates and values