class_docstr: CSV Function-Wrapper Class
  Reads CSV data from disk to produce a partition (given a key).
class_docstr_tok: ["CSV","Function-Wrapper","Class","Reads","CSV","data","from","disk","to","produce","a","partition","(","given","a","key",")","."]
docstr: Return a new CSVFunctionWrapper object with
  a sub-column projection.
docstr_tok: ["Return","a","new","CSVFunctionWrapper","object","with","a","sub-column","projection","."]
code: def project_columns(self, columns):
      """Return a new CSVFunctionWrapper object with
      a sub-column projection.
      """
      # Make sure columns is ordered correctly
      columns = [c for c in self.head.columns if c in columns]
      if columns == self.columns:
          return self
      if self.colname and self.colname not in columns:
          # when path-as-column is on, we must keep it at IO
          # whatever the selection
          head = self.head[columns + [self.colname]]
      else:
          head = self.head[columns]
      return CSVFunctionWrapper(
          self.full_columns,
          columns,
          self.colname,
          head,
          self.header,
          self.reader,
          {c: self.dtypes[c] for c in columns},
          self.enforce,
          self.kwargs,
      )
  
imports: from __future__ import annotations
  import os
  from collections.abc import Mapping
  from io import BytesIO
  from warnings import catch_warnings, simplefilter, warn
  import numpy
  import pandas
  from fsspec.compression import compr
  from fsspec.core import get_fs_token_paths
  from fsspec.core import open
  from fsspec.core import open_files
  from fsspec.utils import infer_compression
  from pandas.api.types import CategoricalDtype, is_datetime64_any_dtype, is_float_dtype, is_integer_dtype, is_object_dtype
  from dask.base import tokenize
  from dask.bytes import read_bytes
  from dask.core import flatten
  from dask.dataframe.backends import dataframe_creation_dispatch
  from dask.dataframe.io.io import from_map
  from dask.dataframe.io.utils import DataFrameIOFunction
  from dask.dataframe.utils import clear_known_categories
  from dask.delayed import delayed
  from dask.utils import asciitable, parse_bytes
  from dask.dataframe.core import _Frame
label_desc: Use image node_id 3 for calling the CSVFunctionWrapper obj's underlying member method code with example usage: obj.project_columns(columns) and returns: CSVFunctionWrapper, self