Как сортировать pandas dataframe из одного столбца

У меня есть фрейм данных, как это:

print(df)

        0          1     2
0   354.7      April   4.0
1    55.4     August   8.0
2   176.5   December  12.0
3    95.5   February   2.0
4    85.6    January   1.0
5     152       July   7.0
6   238.7       June   6.0
7   104.8      March   3.0
8   283.5        May   5.0
9   278.8   November  11.0
10  249.6    October  10.0
11  212.7  September   9.0

Как видите, месяцы не в календарном порядке. Поэтому я создал второй столбец, чтобы получить номер месяца, соответствующий каждому месяцу (1-12). Оттуда, как я могу отсортировать этот фрейм данных в соответствии с порядком календарных месяцев?

Ответ 1

Используйте sort_values для сортировки df по определенным значениям столбца:

In [18]:
df.sort_values('2')

Out[18]:
        0          1     2
4    85.6    January   1.0
3    95.5   February   2.0
7   104.8      March   3.0
0   354.7      April   4.0
8   283.5        May   5.0
6   238.7       June   6.0
5   152.0       July   7.0
1    55.4     August   8.0
11  212.7  September   9.0
10  249.6    October  10.0
9   278.8   November  11.0
2   176.5   December  12.0

Если вы хотите отсортировать по двум столбцам, передайте список меток столбцов в sort_values с метками столбцов, упорядоченными в соответствии с приоритетом сортировки. Если вы используете df.sort_values(['2', '0']), результат будет отсортирован по столбцу 2 затем по столбцу 0. Конечно, это не имеет смысла для этого примера, потому что каждое значение в df['2'] уникально.

Ответ 2

Я попробовал решения, описанные выше, и не добился результатов, поэтому я нашел другое решение, которое работает для меня. Ascending = False - порядок данных в порядке убывания, по умолчанию это True. Я использую python 3.6.6 и pandas 0.23.4 версии.

final_df = df.sort_values(by=['2'], ascending=False)

Вы можете видеть больше деталей в документации панд здесь.

Ответ 3

Просто добавив еще несколько операций с данными. Предположим, у нас есть датафрейм df, мы можем сделать несколько операций, чтобы получить желаемые результаты

ID         cost      tax    label
1       216590      1600    test      
2       523213      1800    test 
3          250      1500    experiment

df['label'].value_counts().to_frame().reset_index()).sort_values('label', ascending=False)

выдаст sorted вывод меток в виде dataframe

    index   label
0   test        2
1   experiment  1

Ответ 4

Так же, как другое решение:

Вы можете классифицировать ваши строковые данные (название месяца) и сортировать их следующим образом:

df.rename(columns={1:'month'},inplace=True)
df['month'] = pd.Categorical(df['month'],categories=['December','November','October','September','August','July','June','May','April','March','February','January'],ordered=True)
df = df.sort_values('month',ascending=False)

Вы получите данные, отсортированные по названию месяца, как вы говорите при создании объекта Categorical.

Ответ 5

у меня есть вопрос относительно.. Могу ли я использовать df.sort_values (["column1", "column2"], ascending = False, True)? То есть, если я хочу, чтобы df сортировался по обоим столбцам, первый - в порядке убывания, а второй - в порядке возрастания?