2017-10-15 76 views
0

我想获取数据框以按月排列的结果。如果我不更改月份到月份的名称并以int的形式保留(例如1:4,2:94),它将按时间顺序排列,但当我更改为月份名称时,按字母顺序按月排列。大熊猫数据框月份整数到月份名称的顺序

如果我做sort = False,它会以随机顺序返回我。感谢我能得到的任何帮助!谢谢!

order_group_df = pd.DataFrame({'Property Name': Propertyname, 'Reported on': ReportedDateList, 'Category': Catname}) 
order_group_df['Reported on'] = pd.to_datetime(order_group_df['Reported on'], format='%m/%d/%Y %H:%M', errors='coerce') 
order_group_df = order_group_df.dropna() 
a = order_group_df.groupby([order_group_df['Reported on'].dt.month.apply(mapper)], sort=False).agg({'count'}).iloc[:, :-2] 

print a 



Results:   
       count 
Reported on  
Feb    94 
Mar    306 
Jan    4 
Jun    9 
Aug    6 
Sep    2 
Oct    2 
Nov    1 
Apr    1 
Jul    5 
+0

为什么不使用时间顺序,因为它的工作原理,并根据第1,第2和第3月对您的月份进行排序? – ALH

+0

如果我使用时间顺序,我不知道我应该放置的位置并应用月份缩写 – 03131992

回答

0

可以使用pandas.Categorical与参数ordered=True。您可以使用categories参数定义您想要的任何订单。

months_order = ["Jan", "Feb", "Mar", "Apr"] 
cat = pd.Categorical(["Mar", "Feb", "Apr", "Jan"], 
        categories=months_order, ordered=True) 

印刷cat会给

[Mar, Feb, Jan, Apr] 
Categories (4, object): [Jan < Feb < Mar < Apr] 

和印刷cat.sort_values()会给

[Jan, Feb, Mar, Apr] 
Categories (4, object): [Jan < Feb < Mar < Apr] 

编辑:在您的情况,您可以取代groupby参数

order_group_df['Reported on'].dt.month.apply(mapper) 

通过

pd.Categorical(order_group_df['Reported on'].dt.month.apply(mapper), 
       categories=['Jan', ..., 'Dec'], 
       ordered=True) 
0

首先Pandas不会对我们有利。所以我们需要使用一个技巧。

这一切首先是一个示例Dataframe

df = DataFrame({'month_name': ['Apr', 'Jan', 'Sep', 'Mar'], 'counts': [13, 12, 13, 9]}) 
print df 

它的输出是:

 counts month_name 
0  13  Apr 
1  12  Jan 
2  13  Sep 
3  9  Mar 

,唯一的办法是建立(使用range)本月数并把它放在一本词典月份名称的关键(%b)。

months = {} 
for date_idx in range(1, 13): 
    month_name = datetime.datetime(2020, date_idx, 1).strftime("%b") 
    months[month_name] = date_idx 

它创建一个字典,我们将用它来映射到我们的Dataframe

现在映射结果:

df["month_number"] = df["month_name"].map(months) 

在上面我们基于在Dataframe列字典叫month_number的名字,并把每月数映射Dataframe

最后一步是基于如下的月份数到Dataframe排序:

sorted_df = df.sort_values(by=['month_number']) 

最终Dataframe的输出将是:

 counts month_name month_number 
1  12  Jan    1 
3  9  Mar    3 
0  13  Apr    4 
2  13  Sep    9 

现在,您可以在python删除month_number方式:

del new_df['month_number'] 

或在Pandas方式:

new_df.drop('month_number', axis=1, inplace=True) 
+0

嗨,尝试后,我得到一个错误,因为我的月份编号都是NaN。它也没有处理dt.month – 03131992

0

使用Sort_Dataframeby_MonthandNumeric_cols功能按月份和数字列进行排序数据帧:

您需要安装两个包如下所示。

pip install sorted-months-weekdays 
pip install sort-dataframeby-monthorweek 

例子:

import pandas as pd 

from sorted_months_weekdays import * 

from sort_dataframeby_monthorweek import * 

df = pd.DataFrame([['Jan',23],['Jan',16],['Dec',35],['Apr',79],['Mar',53], ['Mar',12],['Feb',3]], columns=['Month','Sum']) 
df 
Out[11]: 
    Month Sum 
0 Jan 23 
1 Jan 16 
2 Dec 35 
3 Apr 79 
4 Mar 53 
5 Mar 12 
6 Feb 3 

要按月获得分类数据帧和数字列,你可以使用上述功能。

Sort_Dataframeby_MonthandNumeric_cols(df = df, monthcolumn='Month',numericcolumn='Sum') 
Out[12]: 
    Month Sum 
0 Jan 16 
1 Jan 23 
2 Feb 3 
3 Mar 12 
4 Mar 53 
5 Apr 79 
6 Dec 35