使用 Pandas Python 进行分组和排序

Posted

技术标签:

【中文标题】使用 Pandas Python 进行分组和排序【英文标题】:Group by and Sort with Pandas Python 【发布时间】:2017-11-29 11:48:50 【问题描述】:

我已经按功能进行了分组,我想按时间顺序按月份排序,我该怎么做?目前该功能按字母顺序对月份进行排序:

func = 'Predictions':['count','mean','median']

table1 = df.groupby(['FLAG','MONTH']).agg(func)

表1

         Predictions
                        count        mean      median
FLAG       MONTH                                     
0          Apr          49812  106.458209   75.325309
           Aug          44514   93.718901   74.485782
           Feb          51583   98.921119   74.199794
           Jan          54837  100.381814   74.682187
           Jul          49873  100.621877   73.233328
           Jun          47950  103.688532   74.150171
           Mar          52816  106.094774   75.104832
           May          49404  106.847784   75.844241
           Oct          41828   94.744952   76.178077
           Sep          41074   96.430351   75.335261
1          Apr          83377  285.631679  144.582569
           Aug          66285  217.619038  127.087037
           Feb          79693  310.919925  180.507922
           Jan          64730  290.113451  137.291571
           Jul         105213  298.337893  146.956319
           Jun          90305  312.484185  136.222903
           Mar          97274  308.013477  165.752471
           May          87927  310.162600  142.350688
           Oct          47064  258.213619   85.445310
           Sep          47337  240.361602   84.597842

感谢您的帮助!

【问题讨论】:

【参考方案1】:

你可以使用reindex:

#rewrite code for remove MultiIndex in columns
table1 = df.groupby(['FLAG','MONTH'])['Predictions'].agg(['count','mean','median'])

months = ['Jan', 'Feb', 'Mar', 'Apr','May','Jun', 'Jul', 'Aug','Sep', 'Oct', 'Nov', 'Dec']

df = table1.reindex(months, level=1)
print (df)
             count        mean      median
FLAG MONTH                                
0    Jan     54837  100.381814   74.682187
     Feb     51583   98.921119   74.199794
     Mar     52816  106.094774   75.104832
     Apr     49812  106.458209   75.325309
     May     49404  106.847784   75.844241
     Jun     47950  103.688532   74.150171
     Jul     49873  100.621877   73.233328
     Aug     44514   93.718901   74.485782
     Sep     41074   96.430351   75.335261
     Oct     41828   94.744952   76.178077
1    Jan     64730  290.113451  137.291571
     Feb     79693  310.919925  180.507922
     Mar     97274  308.013477  165.752471
     Apr     83377  285.631679  144.582569
     May     87927  310.162600  142.350688
     Jun     90305  312.484185  136.222903
     Jul    105213  298.337893  146.956319
     Aug     66285  217.619038  127.087037
     Sep     47337  240.361602   84.597842
     Oct     47064  258.213619   85.445310

【讨论】:

那很快。我无法正确复制数据我正在准备 df 直到现在 干杯!我正在尝试将它也应用于同一个表的副本但没有 FLAG 变量,并且出现此错误: NotImplementedError: 参数级别没有为 CategoricalIndex.reindex 实现 哦,好的,找到了!再次感谢@jezrael! 不客气!如果我的回答有帮助,请不要忘记 accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。【参考方案2】:

正如this 问题中提到的,您可以使用以下代码来获取月份到索引的映射

import calendar
map = v: k for k,v in enumerate(calendar.month_abbr)

你可以使用索引映射来创建月份索引的新列

#create the new index
df["index"] = df["MONTH"].map(lambda x: map[x])
#groupby the new index
table1 = df.groupby(['FLAG','index']).agg(func).reset_index()
#drop the multi index
table1 = table1.reset_index()
#sort by month
table1.sort_values("index", inplace = True)

【讨论】:

以上是关于使用 Pandas Python 进行分组和排序的主要内容,如果未能解决你的问题,请参考以下文章

快速入门pandas进行数据挖掘数据分析[多维度排序数据筛选分组计算透视表]

快速入门pandas进行数据挖掘数据分析[多维度排序数据筛选分组计算透视表]

Python Pandas 索引排序/分组/日期时间

pandas基础(part4)--排序/分组/合并

根据 Pandas 中的组大小对分组数据进行排序

Pandas 按值 1 对列进行分组并按频率排序