с предполагаемым примером
StationID,Year,JanValue,FebValue,MarValue,AprValue,DecValue
A,2017,1,2,8,4,5
B,2017,1,2,8,4,5
A,2018,1,2,3,4,5
B,2018,1,2,3,4,5
код будет выглядеть так
df = df.melt(id_vars=['StationID', 'Year'], var_name='Month', value_vars=['JanValue','FebValue','MarValue','AprValue','DecValue'])
, после чего вы можете исправить названия месяцев с помощью
df['Month'] = df['Month'].str.replace('Value','')
Результат
StationID Year Month value
0 A 2017 Jan 1
1 B 2017 Jan 1
2 A 2018 Jan 1
3 B 2018 Jan 1
4 A 2017 Feb 2
5 B 2017 Feb 2
6 A 2018 Feb 2
7 B 2018 Feb 2
8 A 2017 Mar 8
9 B 2017 Mar 8
10 A 2018 Mar 3
11 B 2018 Mar 3
12 A 2017 Apr 4
13 B 2017 Apr 4
14 A 2018 Apr 4
15 B 2018 Apr 4
16 A 2017 Dec 5
17 B 2017 Dec 5
18 A 2018 Dec 5
19 B 2018 Dec 5
Так что осталось только отсортировать строки так, как вы хотите
их отсортировали.
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
df['Month'] = pd.Categorical(df['Month'], categories=months, ordered=True)
df.sort_values(['StationID','Year','Month'], inplace=True)
За результат
StationID Year Month value
0 A 2017 Jan 1
4 A 2017 Feb 2
8 A 2017 Mar 8
12 A 2017 Apr 4
16 A 2017 Dec 5
2 A 2018 Jan 1
6 A 2018 Feb 2
10 A 2018 Mar 3
14 A 2018 Apr 4
18 A 2018 Dec 5
1 B 2017 Jan 1
5 B 2017 Feb 2
9 B 2017 Mar 8
13 B 2017 Apr 4
17 B 2017 Dec 5
3 B 2018 Jan 1
7 B 2018 Feb 2
11 B 2018 Mar 3
15 B 2018 Apr 4
19 B 2018 Dec 5