code: def apply_cats(df, trn):
      
      for n,c in df.items():
          if (n in trn.columns) and (trn[n].dtype.name=='category'):
              df[n] = c.astype('category').cat.as_ordered()
              df[n].cat.set_categories(trn[n].cat.categories, ordered=True, inplace=True)
docs: Changes any columns of strings in df into categorical variables using trn as
      a template for the category codes.
      Parameters:
      -----------
      df: A pandas dataframe. Any columns of strings will be changed to
          categorical values. The category codes are determined by trn.
      trn: A pandas dataframe. When creating a category for df, it looks up the
          what the category's code were in trn and makes those the category codes
          for df.
      Examples:
      ---------
      >>> df = pd.DataFrame({'col1' : [1, 2, 3], 'col2' : ['a', 'b', 'a']})
      >>> df
         col1 col2
      0     1    a
      1     2    b
      2     3    a
      note the type of col2 is string
      >>> train_cats(df)
      >>> df
         col1 col2
      0     1    a
      1     2    b
      2     3    a
      now the type of col2 is category {a : 1, b : 2}
      >>> df2 = pd.DataFrame({'col1' : [1, 2, 3], 'col2' : ['b', 'a', 'a']})
      >>> apply_cats(df2, df)
             col1 col2
          0     1    b
          1     2    a
          2     3    a
      now the type of col is category {a : 1, b : 2}