1

I have a DataFrame that looks like the one on the left below and I need to re-arrange so it looks like the one on the right:

  XYZ  year  month  values                     A      B      C      D
0   A  2006      8   35601            2005-01  NaN    NaN    NaN    NaN
1   A  2005      3   13164            2005-02  36889  NaN    NaN    NaN
2   A  2006      5   45830            2005-03  13164  NaN    NaN    NaN
3   A  2005      5   47495            2005-04  NaN    NaN    NaN    NaN
4   A  2005      2   36889     ->     .        
5   B  2006      1   33694            2006-01  NaN    33694  NaN    NaN
6   C  2006      2    7400            2006-02  NaN    NaN    7400   NaN
7   C  2006      6    5698            .
8   D  2006      6   14049            .
9   A  2005      9   22650            2006-08  35601  NaN    NaN    NaN

I have created the values that will be used as columns in the new DF, something like:

df1 = pd.DataFrame(..., columns=df.XYZ.unique().tolist())

and I have created the values that will be used as index in the new DF, something like:

df1 = pd.DataFrame(..., index=pd.date_range('2005-01-01', periods=24,freq='M').to_period('m'))

I need help to understand how to iterate through df so that I can use the matching value for each column, based that the new index is mapped correctly to legacy DF values for ['year','month']

Any help is appreciated, thanks!

Thanos
  • 2,472
  • 1
  • 16
  • 33

1 Answers1

0

Use a pivot and reindex your values with the date_range:

(df.assign(date=pd.to_datetime(df[['year', 'month']].assign(day=1)
                               ).dt.to_period('m'))
   .pivot(index='date', columns='XYZ', values='values')
   .reindex(pd.date_range('2005-01-01', periods=24, freq='M').to_period('m'))
)

Output:

XYZ            A        B       C        D
2005-01      NaN      NaN     NaN      NaN
2005-02  36889.0      NaN     NaN      NaN
2005-03  13164.0      NaN     NaN      NaN
2005-04      NaN      NaN     NaN      NaN
2005-05  47495.0      NaN     NaN      NaN
2005-06      NaN      NaN     NaN      NaN
2005-07      NaN      NaN     NaN      NaN
2005-08      NaN      NaN     NaN      NaN
2005-09  22650.0      NaN     NaN      NaN
2005-10      NaN      NaN     NaN      NaN
2005-11      NaN      NaN     NaN      NaN
2005-12      NaN      NaN     NaN      NaN
2006-01      NaN  33694.0     NaN      NaN
2006-02      NaN      NaN  7400.0      NaN
2006-03      NaN      NaN     NaN      NaN
2006-04      NaN      NaN     NaN      NaN
2006-05  45830.0      NaN     NaN      NaN
2006-06      NaN      NaN  5698.0  14049.0
2006-07      NaN      NaN     NaN      NaN
2006-08  35601.0      NaN     NaN      NaN
2006-09      NaN      NaN     NaN      NaN
2006-10      NaN      NaN     NaN      NaN
2006-11      NaN      NaN     NaN      NaN
2006-12      NaN      NaN     NaN      NaN
mozway
  • 194,879
  • 13
  • 39
  • 75