熊猫系列按月索引排序

时间:2016-11-26 07:44:00

标签: python pandas

Dec    47
Nov    36
Oct    14
Sep     2
Jan     2
Aug     2
May     1
Apr     1
Jun     1
Jul     1
Feb     1
Name: date, dtype: int64

我要按照月份对索引列为月份的上述系列进行排序。但是,不是按月份的日历顺序排序,而是排序功能按月份名称的字典顺序排序。如何正确排序以上内容?我猜我必须指定索引类型是月而不是字符串。任何帮助表示赞赏。下面的代码段。

import calendar
movies = release_dates[release_dates.title.str.contains('Christmas') & (release_dates.country=='USA')]
movies = movies.date.dt.month.apply(lambda x: calendar.month_abbr[x])
counts = movies.value_counts()
counts

3 个答案:

答案 0 :(得分:3)

您可以将已排序的CategoricalIndexsort_index一起使用:

df.index = pd.CategoricalIndex(df.index, 
                               categories=['Jan', 'Feb', 'Mar', 'Apr','May','Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov', 'Dec'], 
                               sorted=True)
df = df.sort_index()

print (df)
     date
Jan     2
Feb     1
Apr     1
May     1
Jun     1
Jul     1
Aug     2
Sep     2
Oct    14
Nov    36
Dec    47

答案 1 :(得分:0)

好吧,这不是很复杂。我敢肯定,分类可能只是因为我无法使用Categorical解决问题。 我做的是 -

  1. 按月份排序,而月份则以整数表示
  2. 对结果系列在索引上应用了一个映射器,将整数月转换为缩写字符串
  3. 我确信有更有效的解决方法,所以如果你有更好的方法,请发布相同的。

        import calendar
        months = release_dates[release_dates.title.str.contains('Christmas') & (release_dates.country=='USA')].date.dt.month
        counts = months.value_counts()
        counts.sort_index(inplace=True)
        counts.index = map(lambda x: calendar.month_abbr[x], counts.index)
        counts.plot.bar()

答案 2 :(得分:0)

在@jezrael的非常有帮助的答案中添加:

在熊猫0.25.1中,pandas.CategoricalIndexsorted已替换为ordered

旧方法:

df.index = pd.CategoricalIndex(df.index, 
                               categories=['Jan', 'Feb', 'Mar', 'Apr','May','Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov', 'Dec'], 
                               sorted=True)
df = df.sort_index()

错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-468-3f0ab66734d4> in <module>
      2 net.index = pd.CategoricalIndex(net.index, 
      3                                categories=['Jan', 'Feb', 'Mar', 'Apr','May','Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov', 'Dec'],
----> 4                                sorted=True)
      5 net = net.sort_index()
      6 net

TypeError: __new__() got an unexpected keyword argument 'sorted'

新方法:

df.index = pd.CategoricalIndex(df.index, 
                               categories=['Jan', 'Feb', 'Mar', 'Apr','May','Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov', 'Dec'], 
                               ordered=True)
df = df.sort_index()