code: def process_one(df, *keys, columns=['key', 'agent_id'], values='value',
                  fill=True, index=['t_step',],
                  aggfunc='first', **kwargs):
      '''
      Process a dataframe in canonical form ``(t_step, agent_id, key, value, value_type)`` into
      a dataframe with a column per key
      '''
      if df is None:
          return df
      if keys:
          df = df[df['key'].isin(keys)]
  
      df = df.pivot_table(values=values, index=index, columns=columns,
                          aggfunc=aggfunc, **kwargs)
      if fill:
          df = fillna(df)
      return df process_one(df, *keys, columns=['key', 'agent_id'], values='value',
                  fill=True, index=['t_step',],
                  aggfunc='first', **kwargs):
      '''
      Process a dataframe in canonical form ``(t_step, agent_id, key, value, value_type)`` into
      a dataframe with a column per key
      '''
      if df is None:
          return df
      if keys:
          df = df[df['key'].isin(keys)]
  
      df = df.pivot_table(values=values, index=index, columns=columns,
                          aggfunc=aggfunc, **kwargs)
      if fill:
          df = fillna(df)
      return df
docs: Process a dataframe in canonical form ``(t_step, agent_id, key, value, value_type)`` into
      a dataframe with a column per key