Reputation: 502
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
Reputation: 11502
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