Pandas - как правильно отсортировать номера недели и года в формате строк? - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть такой pandas фрейм данных, который отсортирован следующим образом:

>>> weekly_count.sort_values(by='date_in_weeks', inplace=True)
>>> weekly_count.loc[:9,:]

  date_in_weeks count
0   1-2013      362
1   1-2014      378
2   1-2015      201
3   1-2016      294
4   1-2017      300
5   1-2018      297
6   10-2013     329
7   10-2014     314
8   10-2015     324
9   10-2016     322

в приведенных выше данных, первый столбец, все строки date_in_weeks просто "номер недели года - года" , Теперь я хочу отсортировать это так:

  date_in_weeks count
0   1-2013      362
6   10-2013     329
1   1-2014      378
7   10-2014     314
2   1-2015      201
8   10-2015     324
3   1-2016      294
9   10-2016     322
4   1-2017      300
5   1-2018      297

Как мне это сделать?

Ответы [ 3 ]

5 голосов
/ 21 февраля 2020

Использовать Series.argsort с преобразованием в дату и время в формате %W номер недели в году, ссылка :

df = df.iloc[pd.to_datetime(df['date_in_weeks'] + '-0',format='%W-%Y-%w').argsort()]
print (df)
  date_in_weeks  count
0        1-2013    362
6       10-2013    329
1        1-2014    378
7       10-2014    314
2        1-2015    201
8       10-2015    324
3        1-2016    294
9       10-2016    322
4        1-2017    300
5        1-2018    297
3 голосов
/ 21 февраля 2020

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

s = pd.to_datetime(df['date_in_weeks'],format='%M-%Y')
final = df.assign(dt=s).sort_values(['dt','count']).drop('dt',1)

print(final)

  date_in_weeks  count
0        1-2013    362
6       10-2013    329
1        1-2014    378
7       10-2014    314
2        1-2015    201
8       10-2015    324
3        1-2016    294
9       10-2016    322
4        1-2017    300
5        1-2018    297
2 голосов
/ 21 февраля 2020

Вы можете попробовать использовать вспомогательные столбцы:

import pandas as pd
df = pd.DataFrame({'date_in_weeks':['1-2013','1-2014','1-2015','10-2013','10-2014'],
                   'count':[362,378,201,329,314]})
df['aux'] = df['date_in_weeks'].str.split('-')
df['aux_2'] = df['aux'].str.get(1).astype(int)
df['aux'] = df['aux'].str.get(0).astype(int)
df = df.sort_values(['aux_2','aux'],ascending=True)
df = df.drop(columns=['aux','aux_2'])
print(df)

Вывод:

  date_in_weeks  count
0        1-2013    362
3       10-2013    329
1        1-2014    378
4       10-2014    314
2        1-2015    201
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...