1

I have df as below:

      CV    Alg Month  Result
0   CV_1    RND   JAN    66.6
1   CV_1    XGB   FEB    77.0
2   CV_1     LR   MAR    85.5
3   CV_1    DCT   APR    53.7
4   CV_1    ADB   MAY    78.0
5   CV_1  LASSO   JUN    77.7
6   CV_2    RND   JAN    44.3
7   CV_2    XGB   FEB    77.9
8   CV_2     LR   MAR    85.9
9   CV_2    DCT   APR    88.0
10  CV_2    ADB   MAY    66.8
11  CV_2  LASSO   JUN    77.3

{'CV': {0: 'CV_1', 1: 'CV_1', 2: 'CV_1', 3: 'CV_1', 4: 'CV_1', 5: 'CV_1', 6: 'CV_2', 7: 'CV_2', 8: 'CV_2', 9: 'CV_2', 10: 'CV_2', 11: 'CV_2'}, 'Alg': {0: 'RND', 1: 'XGB', 2: 'LR', 3: 'DCT', 4: 'ADB', 5: 'LASSO', 6: 'RND', 7: 'XGB', 8: 'LR', 9: 'DCT', 10: 'ADB', 11: 'LASSO'}, 'Month': {0: 'JAN', 1: 'FEB', 2: 'MAR', 3: 'APR', 4: 'MAY', 5: 'JUN', 6: 'JAN', 7: 'FEB', 8: 'MAR', 9: 'APR', 10: 'MAY', 11: 'JUN'}, 'Result': {0: 66.6, 1: 77.0, 2: 85.5, 3: 53.7, 4: 78.0, 5: 77.7, 6: 44.3, 7: 77.9, 8: 85.9, 9: 88.0, 10: 66.8, 11: 77.3}}

And I'm trying to create final result dataframe using below format:

     RND  XGB   LR  DCT  ADB LASSO
JAN  NaN  NaN  NaN  NaN  NaN   NaN
FEB  NaN  NaN  NaN  NaN  NaN   NaN
MAR  NaN  NaN  NaN  NaN  NaN   NaN
APR  NaN  NaN  NaN  NaN  NaN   NaN
MAY  NaN  NaN  NaN  NaN  NaN   NaN
JUN  NaN  NaN  NaN  NaN  NaN   NaN

NaN values should be average of Result column of CV_1, CV_2 ... CV_n for each month and each algorithm.

I've used set_index for months and groupby for Alg column but could not do it. How can i do this?

talatccan
  • 743
  • 5
  • 19

1 Answers1

1

Use DataFrame.pivot_table but for correct ordering use ordered categoricals:

cats = ['JAN','FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
df['Month'] = pd.Categorical(df['Month'], ordered=True, categories=cats)
df['Alg'] = pd.Categorical(df['Alg'], ordered=True, categories=df['Alg'].drop_duplicates())

df = df.pivot_table(index='Month', columns='Alg', values='Result', aggfunc='mean')
print (df)
Alg      RND    XGB    LR    DCT   ADB  LASSO
Month                                        
JAN    55.45    NaN   NaN    NaN   NaN    NaN
FEB      NaN  77.45   NaN    NaN   NaN    NaN
MAR      NaN    NaN  85.7    NaN   NaN    NaN
APR      NaN    NaN   NaN  70.85   NaN    NaN
MAY      NaN    NaN   NaN    NaN  72.4    NaN
JUN      NaN    NaN   NaN    NaN   NaN   77.5

Or DataFrame.reindex values exist in index with Index.intersection:

cats = ['JAN','FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC']
df = (df.pivot_table(index='Month', columns='Alg', values='Result', aggfunc='mean')
         .reindex(index=pd.Index(cats).intersection(df['Month'].unique()),
                  columns= df['Alg'].drop_duplicates()))

print (df)
Alg    RND    XGB    LR    DCT   ADB  LASSO
JAN  55.45    NaN   NaN    NaN   NaN    NaN
FEB    NaN  77.45   NaN    NaN   NaN    NaN
MAR    NaN    NaN  85.7    NaN   NaN    NaN
APR    NaN    NaN   NaN  70.85   NaN    NaN
MAY    NaN    NaN   NaN    NaN  72.4    NaN
JUN    NaN    NaN   NaN    NaN   NaN   77.5
jezrael
  • 822,522
  • 95
  • 1,334
  • 1,252