code: def default_fill_na_per_column_type(
      df: pd.DataFrame,
      cat_features: t.Optional[t.Union[pd.Series, t.List]],
  ) -> pd.DataFrame:
      """Fill NaN values per column type."""
      pd.set_option("mode.chained_assignment", None)
      if cat_features is None:
          cat_features = infer_categorical_features(df)
  
      result = {}
      for col_name in df.columns:
          modified_col = default_fill_na_series(
              df[col_name], col_name in cat_features
          )
          if modified_col is not None:
              result[col_name] = modified_col
      return pd.DataFrame(result, index=df.index)
  
file_path: deepchecks/deepchecks/utils/dataframes.py
imports: import typing
  import numpy
  import pandas
  from pandas.core.dtypes.common import is_float_dtype, is_integer_dtype, is_numeric_dtype
  from deepchecks.core.errors import DeepchecksValueError
  from deepchecks.utils.type_inference import infer_categorical_features
  from deepchecks.utils.typing import Hashable
  from deepchecks.utils.validation import ensure_hashable_or_mutable_sequence
label_desc: Use image node_id 1 for calling a global function with example usage: default_fill_na_per_column_type(df, cat_features) and returns: pd