Сортировать столбец в Pandas DataFrame по определенному порядку - PullRequest
0 голосов
/ 12 октября 2018

Учитывая этот DataFrame:

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])

Я хотел бы отсортировать столбец A в следующем порядке: июль, август, сентябрь. Есть ли какой-нибудь способ использовать функцию сортировки, такую ​​как "sort_values", но предварительно определитьпорядок сортировки по значениям?

Ответы [ 6 ]

0 голосов
/ 12 октября 2018

Вы против использования полных названий месяцев или последовательных сокращений?

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])

df

import calendar

df = df.replace({'Sept':'September'})

calendar.month_name[1:]

Вывод:

['January',
 'February',
 'March',
 'April',
 'May',
 'June',
 'July',
 'August',
 'September',
 'October',
 'November',
 'December']

df['A'] = pd.Categorical(df.A, categories=calendar.month_name[1:], ordered=True)

df.sort_values('A')

Вывод:

           A  B
1       July  3
0     August  2
2  September  6

Или использовать calendar.month_abbr

calendar.month_abbr[1:]

Выход:

['Jan',
 'Feb',
 'Mar',
 'Apr',
 'May',
 'Jun',
 'Jul',
 'Aug',
 'Sep',
 'Oct',
 'Nov',
 'Dec']
0 голосов
/ 12 октября 2018

Я изменил ваш «Сентябрь» на «Сентябрь», чтобы он соответствовал соглашению об именах других месяцев.

Затем я создал упорядоченный список названий месяцев с помощью pd.date_range.

Подразделяет список на значения, которые вы имели (сохраняет правильный порядок по месяцам).

Сделал категориальную с использованием этого подсписка, а затем отсортировал по этим значениям

import pandas as pd


df = pd.DataFrame([['August', 2], ['July', 3], ['September', 6]], columns=['A', 'B'])

full_month_list = pd.date_range('2018-01-01','2019-01-01', freq='MS').strftime("%B").tolist()
partial_month_list = [x for x in month_list if x in df['A'].values]
df['A'] = pd.Categorical(df['A'], partial_month_list)

df.sort_values('A')

В результате:

    A           B
1   July        3
0   August      2
2   September   6
0 голосов
/ 12 октября 2018

Определение порядка в словаре и сортировка по нему

sort_dict = {'July':0,'August':1,'Sept':2}
df.iloc[df['A'].map(sort_dict).sort_values().index]

Вывод

       A    B
1   July    3
0   August  2
2   Sept    6
0 голосов
/ 12 октября 2018

Временно преобразуйте месяц str в datetime и сортируйте

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])
df['tmp'] = pd.to_datetime(df['A'].str[:3], format='%b').dt.month
df.sort_values(by = ['tmp']).drop('tmp', 1)


    A       B
1   July    3
0   August  2
2   Sept    6
0 голосов
/ 12 октября 2018

Вы можете назначить свои собственные значения для сортировки столбца, отсортировать по ним и затем отбросить их:

df = pd.DataFrame([['August', 2], ['July', 3], ['Sept', 6]], columns=['A', 'B'])
value_map = {'August': 1, 'July': 0, 'Sept': 2}
def sort_by_key(df, col, value_map):
    df = df.assign(sort = lambda df: df[col].map(value_map))
    return df.sort_values('sort') \
             .drop('sort', axis='columns')

sort_by_key(df, 'A', value_map)

Результат:

        A  B
1    July  3
0  August  2
2    Sept  6
0 голосов
/ 12 октября 2018

Использование Categorical

df.A=pd.Categorical(df.A,categories=['July', 'August', 'Sept'])
df=df.sort_values('A')
df
Out[310]: 
        A  B
1    July  3
0  August  2
2    Sept  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...