Вы можете преобразовать имена столбцов в datetime, а затем отсортировать их:
df.columns = pd.to_datetime(df.columns, format='%b %y')
df = df[sorted(df.columns)]
>>> df
2018-01-01 2018-02-01 2018-03-01
Flavor
Vanilla 10.0 16.0 0.0
Chocolate 20.0 20.0 16.0
Если вы хотите вернуть исходные имена столбцов строк, просто добавьте:
df.columns = df.columns.strftime('%b %y')
>>> df
Jan 18 Feb 18 Mar 18
Flavor
Vanilla 10.0 16.0 0.0
Chocolate 20.0 20.0 16.0
Альтернативой являетсясделать все это в одной строке, используя sorted
с ключом (за идею @SpghttCd):
df[sorted(df.columns, key = lambda x: pd.to_datetime(x, format='%b %y'))]