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