2017-10-15 101 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