royalewithcheese
royalewithcheese

Reputation: 502

How do I add and sort the month-year columns in my final df using pandas?

Supposing I have a dummy df like the following,

{'column1': ['ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD'], 'column2': ['V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V'], 'column3': ['CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP'], 'column4': ['OCP', 'AC', 'TC', 'AA', 'EE', 'CS', 'UUU', 'MMM', 'CCC', 'TOQ', 'OC', 'FR', 'OCP', 'AC', 'TC', 'AA', 'EE', 'CS', 'UUU', 'MMM', 'CCC', 'TOQ', 'OC', 'FR'], 'Apr-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Aug-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Feb-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jan-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jul-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jun-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Mar-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'May-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Nov-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Oct-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Sep-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Unnamed: 15': [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]}

As you can see from the above df, month-year Dec-21 is missing from the df.

Is there a way to add the missing month-year column followed by sorting them so that I may see the final df having months-years from Jan-21 to Dec-21 with year being generic datetime.now().strftime('%y')

Upvotes: 3

Views: 47

Answers (1)

This is only a partial answer to your question and it answers the second part of it. (Unless you need to do this for many years, I'd add the missing month manually, e.g. df['Dec-21'] = df['Nov-21']).To sort the columns in ascending order of time you can do the following for the dataframe you gave:

import pandas as pd
import numpy as np
from numpy import nan

my_dict = {'column1': ['ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD', 'ABCD'], 'column2': ['V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V', 'V'], 'column3': ['CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CT', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP', 'CP'], 'column4': ['OCP', 'AC', 'TC', 'AA', 'EE', 'CS', 'UUU', 'MMM', 'CCC', 'TOQ', 'OC', 'FR', 'OCP', 'AC', 'TC', 'AA', 'EE', 'CS', 'UUU', 'MMM', 'CCC', 'TOQ', 'OC', 'FR'], 'Apr-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Aug-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Feb-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jan-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jul-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Jun-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Mar-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'May-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Nov-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Oct-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Sep-21': [nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan, nan, nan, 0.0, nan, nan, nan, nan, nan, nan, 0.0, 0.0, nan], 'Unnamed: 15': [nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]}
df = pd.DataFrame(my_dict)

that is

   column1 column2 column3 column4  Apr-21  Aug-21  Feb-21  Jan-21  Jul-21  \
0     ABCD       V      CT     OCP     NaN     NaN     NaN     NaN     NaN   
1     ABCD       V      CT      AC     NaN     NaN     NaN     NaN     NaN   
2     ABCD       V      CT      TC     0.0     0.0     0.0     0.0     0.0   
3     ABCD       V      CT      AA     NaN     NaN     NaN     NaN     NaN   
4     ABCD       V      CT      EE     NaN     NaN     NaN     NaN     NaN   
5     ABCD       V      CT      CS     NaN     NaN     NaN     NaN     NaN   
6     ABCD       V      CT     UUU     NaN     NaN     NaN     NaN     NaN   
7     ABCD       V      CT     MMM     NaN     NaN     NaN     NaN     NaN   
8     ABCD       V      CT     CCC     NaN     NaN     NaN     NaN     NaN   
9     ABCD       V      CT     TOQ     0.0     0.0     0.0     0.0     0.0   
10    ABCD       V      CT      OC     0.0     0.0     0.0     0.0     0.0   
11    ABCD       V      CT      FR     NaN     NaN     NaN     NaN     NaN   
12    ABCD       V      CP     OCP     NaN     NaN     NaN     NaN     NaN   
13    ABCD       V      CP      AC     NaN     NaN     NaN     NaN     NaN   
14    ABCD       V      CP      TC     0.0     0.0     0.0     0.0     0.0   
15    ABCD       V      CP      AA     NaN     NaN     NaN     NaN     NaN   
16    ABCD       V      CP      EE     NaN     NaN     NaN     NaN     NaN   
17    ABCD       V      CP      CS     NaN     NaN     NaN     NaN     NaN   
18    ABCD       V      CP     UUU     NaN     NaN     NaN     NaN     NaN   
19    ABCD       V      CP     MMM     NaN     NaN     NaN     NaN     NaN   
20    ABCD       V      CP     CCC     NaN     NaN     NaN     NaN     NaN   
21    ABCD       V      CP     TOQ     0.0     0.0     0.0     0.0     0.0   
22    ABCD       V      CP      OC     0.0     0.0     0.0     0.0     0.0   
23    ABCD       V      CP      FR     NaN     NaN     NaN     NaN     NaN   

    Jun-21  Mar-21  May-21  Nov-21  Oct-21  Sep-21  Unnamed: 15  
0      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
1      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
2      0.0     0.0     0.0     0.0     0.0     0.0          NaN  
3      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
4      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
5      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
6      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
7      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
8      NaN     NaN     NaN     NaN     NaN     NaN          NaN  
9      0.0     0.0     0.0     0.0     0.0     0.0          NaN  
10     0.0     0.0     0.0     0.0     0.0     0.0          NaN  
11     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
12     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
13     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
14     0.0     0.0     0.0     0.0     0.0     0.0          NaN  
15     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
16     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
17     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
18     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
19     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
20     NaN     NaN     NaN     NaN     NaN     NaN          NaN  
21     0.0     0.0     0.0     0.0     0.0     0.0          NaN  
22     0.0     0.0     0.0     0.0     0.0     0.0          NaN  
23     NaN     NaN     NaN     NaN     NaN     NaN          NaN  

you can sort it the following way

import operator
sorted_dict = sorted(dict(zip(df.columns[4:14],pd.to_datetime(df.columns[4:14], format='%b-%y'))).items(), key=operator.itemgetter(1))
df[[i[0] for i in sorted_dict]]

which returns for the date part of your df:

    Jan-21  Feb-21  Mar-21  Apr-21  May-21  Jun-21  Jul-21  Aug-21  Oct-21  \
0      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
1      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
2      0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
3      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
4      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
5      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
6      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
7      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
8      NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
9      0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
10     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
11     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
12     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
13     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
14     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
15     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
16     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
17     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
18     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
19     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
20     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   
21     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
22     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0     0.0   
23     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN   

    Nov-21  
0      NaN  
1      NaN  
2      0.0  
3      NaN  
4      NaN  
5      NaN  
6      NaN  
7      NaN  
8      NaN  
9      0.0  
10     0.0  
11     NaN  
12     NaN  
13     NaN  
14     0.0  
15     NaN  
16     NaN  
17     NaN  
18     NaN  
19     NaN  
20     NaN  
21     0.0  
22     0.0  
23     NaN  

You then need to merge it with the remaining part of the df.

Upvotes: 1

Related Questions