docs: def get_bad_rows_and_cols(df, validation_names, type_col_names,
                            value_col_names, verbose=False):
      """
      Input: validated DataFrame, all validation names, names of the type columns,
      names of the value columns, verbose (True or False).
      Output: list of rows with bad values, list of columns with bad values,
      list of missing (but required) columns.
      """
      df["num"] = list(range(len(df)))
      problems = df[validation_names.union(["num"])]
      all_problems = problems.dropna(how='all', axis=0, subset=validation_names)
      value_problems = problems.dropna(how='all', axis=0, subset=type_col_names.union(value_col_names))
      all_problems = all_problems.dropna(how='all', axis=1)
      value_problems = value_problems.dropna(how='all', axis=1)
      if not len(problems):
          return None, None, None
      #
      bad_cols = all_problems.columns
      prefixes = ["value_pass_", "type_pass_"]
      missing_prefix = "presence_pass_"
      problem_cols = []
      missing_cols = []
      long_missing_cols = []
      problem_rows = []
      for col in bad_cols:
          pre, stripped_col = extract_col_name(col)
          for prefix in prefixes:
              if col.startswith(prefix):
                  problem_cols.append(stripped_col)
                  continue
          if col.startswith(missing_prefix):
              missing_cols.append(stripped_col)
              long_missing_cols.append(col)
      if len(value_problems):
          bad_rows = list(zip(list(value_problems["num"]), list(value_problems.index)))
      else:
          bad_rows = []
      if verbose:
          if bad_rows:
              formatted_rows = ["row: {}, name: {}".format(row[0], row[1]) for row in bad_rows]
              if len(bad_rows) > 5:
                  print("-W- these rows have problems:\n", "\n".join(formatted_rows[:5]), " ...")
                  print("(for full error output see error file)")
              else:
                  print("-W- these rows have problems:", "\n".join(formatted_rows))
          if problem_cols:
              print("-W- these columns contain bad values:", ", ".join(set(problem_cols)))
          if missing_cols:
              print("-W- these required columns are missing:", ", ".join(missing_cols))
      return bad_rows, problem_cols, missing_cols