Pandas Dataframe月份int to month名称按顺序排列

时间:2017-10-15 13:58:15

标签: python

我正在尝试让数据框按月的顺序打印出结果。如果我不改变月份名称并保留为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

3 个答案:

答案 0 :(得分: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,并将字典的月号放在名为Dataframe的{​​{1}}列中。

最后一步是根据月份编号对month_number进行排序,如下所示:

Dataframe

最终sorted_df = df.sort_values(by=['month_number']) 的输出将为:

Dataframe

现在可以用python方式删除 counts month_name month_number 1 12 Jan 1 3 9 Mar 3 0 13 Apr 4 2 13 Sep 9

month_number

或以del new_df['month_number'] 方式:

Pandas

答案 1 :(得分: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)

答案 2 :(得分: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