class_docstr: Parquet Function-Wrapper Class
  Reads parquet data from disk to produce a partition
  (given a `part` argument).
class_docstr_tok: ["Parquet","Function-Wrapper","Class","Reads","parquet","data","from","disk","to","produce","a","partition","(","given","a","`","part","`","argument",")","."]
docstr: Return a new ParquetFunctionWrapper object
  with a sub-column projection.
code: def project_columns(self, columns):
      """Return a new ParquetFunctionWrapper object
      with a sub-column projection.
      """
      if columns == self.columns:
          return self
      return ParquetFunctionWrapper(
          self.engine,
          self.fs,
          self.meta,
          columns,
          self.index,
          self.dtype_backend,
          None,  # Already merged into common_kwargs
          self.common_kwargs,
      )
  
imports: from __future__ import annotations
  import contextlib
  import math
  import warnings
  from typing import Literal
  import pandas
  import tlz
  from fsspec.core import get_fs_token_paths
  from fsspec.utils import stringify_path
  import dask
  from dask.base import tokenize
  from dask.blockwise import BlockIndex
  from dask.dataframe.backends import dataframe_creation_dispatch
  from dask.dataframe.core import DataFrame, Scalar
  from dask.dataframe.io.io import from_map
  from dask.dataframe.io.parquet.utils import Engine, _sort_and_analyze_paths, _split_user_options
  from dask.dataframe.io.utils import DataFrameIOFunction, _is_local_fs
  from dask.dataframe.methods import concat
  from dask.delayed import Delayed
  from dask.highlevelgraph import HighLevelGraph
  from dask.layers import DataFrameIOLayer
  from dask.utils import apply, import_required, natural_sort_key, parse_bytes
label_desc: Use image node_id 3 for calling the ParquetFunctionWrapper obj's underlying member method code with example usage: obj.project_columns(columns) and returns: ParquetFunctionWrapper, self