Python 对大熊猫进行排序';按月份名称列出的数据帧系列?

Python 对大熊猫进行排序';按月份名称列出的数据帧系列?,python,pandas,sorting,date,dataframe,Python,Pandas,Sorting,Date,Dataframe,我有一个序列对象,它具有: date price dec 12 may 15 apr 13 .. 问题陈述:我想让它按月显示,计算每个月的平均价格,并按月以排序方式显示 期望输出: month mean_price Jan XXX Feb XXX Mar XXX 我想制作一个列表并将其传递给排序函数: months = ["Jan", "Feb", "Mar", "Apr", "May"

我有一个序列对象,它具有:

    date   price
    dec      12
    may      15
    apr      13
    ..
问题陈述:我想让它按月显示,计算每个月的平均价格,并按月以排序方式显示

期望输出:

 month mean_price
  Jan    XXX
  Feb    XXX
  Mar    XXX
我想制作一个列表并将其传递给排序函数:

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
但是sort_值不支持该序列

我的一个大问题是即使

df=df.sort_值(按class='date',升序=True,就地=True)
对于初始的
df
,但在我执行了
groupby
之后,它没有维护排序后的
df
中的顺序

最后,我需要从初始数据框中选择这两列。对datetime列进行排序,通过使用月份(dt.strftime(“%B”)的groupby,排序混乱。现在我必须按月份名称对它进行排序


我的代码:

df # has 5 columns though I need the column 'date' and 'price'

df.sort_values(by='date',inplace=True) #at this part it is sorted according to date, great
total=(df.groupby(df['date'].dt.strftime('%B'))['price'].mean()) # Though now it is not as it was but instead the months appear alphabetically

您可以使用分类数据来启用适当的排序:

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
df['months'] = pd.Categorical(df['months'], categories=months, ordered=True)
df.sort_values(...)  # same as you have now; can use inplace=True
指定类别时,熊猫会记住指定顺序作为默认排序顺序


Docs:Pandas categories>

您可以使用分类数据来启用适当的排序:

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", 
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
df['months'] = pd.Categorical(df['months'], categories=months, ordered=True)
df.sort_values(...)  # same as you have now; can use inplace=True
指定类别时,熊猫会记住指定顺序作为默认排序顺序

Docs:Pandas categories>

感谢@Brad Solomon提供了一种更快的字符串大写方法

注1@Brad Solomon使用的答案比我的答案更能节省您的资源。他演示了如何为分类数据分配顺序。你不应该错过它:P

或者,您可以使用

df = pd.DataFrame([["dec", 12], ["jan", 40], ["mar", 11], ["aug", 21],
                  ["aug", 11], ["jan", 11], ["jan", 1]], 
                   columns=["Month", "Price"])
# Preprocessing: capitalize `jan`, `dec` to `Jan` and `Dec`
df["Month"] = df["Month"].str.capitalize()

# Now the dataset should look like
#   Month Price
#   -----------
#    Dec    XX
#    Jan    XX
#    Apr    XX

# make it a datetime so that we can sort it: 
# use %b because the data use the abbriviation of month
df["Month"] = pd.to_datetime(df.Month, format='%b', errors='coerce').dt.month
df = df.sort_values(by="Month")

total = (df.groupby(df['Month"])['Price'].mean())

# total 
Month
1     17.333333
3     11.000000
8     16.000000
12    12.000000
注2 默认情况下,
groupby
将为您排序组键。请注意在
df=df.sort\u值(by=same\u键)
total=(df.groupby(df[same\u键])['Price'].mean())中使用相同的键进行排序和分组。否则,可能会出现意外行为。有关更多信息,请参阅

注3 计算效率更高的方法是先计算平均值,然后按月份排序。这样,您只需要对12项进行排序,而不需要对整个
df
进行排序。如果不需要对
df
进行排序,将降低计算成本

注4对于已经将
作为索引的人来说,想知道如何将其分类,看看@jezrael有一个在中排序的分类索引的工作示例,感谢@Brad Solomon提供了一种更快的字符串大写方法

注1@Brad Solomon使用的答案比我的答案更能节省您的资源。他演示了如何为分类数据分配顺序。你不应该错过它:P

或者,您可以使用

df = pd.DataFrame([["dec", 12], ["jan", 40], ["mar", 11], ["aug", 21],
                  ["aug", 11], ["jan", 11], ["jan", 1]], 
                   columns=["Month", "Price"])
# Preprocessing: capitalize `jan`, `dec` to `Jan` and `Dec`
df["Month"] = df["Month"].str.capitalize()

# Now the dataset should look like
#   Month Price
#   -----------
#    Dec    XX
#    Jan    XX
#    Apr    XX

# make it a datetime so that we can sort it: 
# use %b because the data use the abbriviation of month
df["Month"] = pd.to_datetime(df.Month, format='%b', errors='coerce').dt.month
df = df.sort_values(by="Month")

total = (df.groupby(df['Month"])['Price'].mean())

# total 
Month
1     17.333333
3     11.000000
8     16.000000
12    12.000000
注2 默认情况下,
groupby
将为您排序组键。请注意在
df=df.sort\u值(by=same\u键)
total=(df.groupby(df[same\u键])['Price'].mean())中使用相同的键进行排序和分组。否则,可能会出现意外行为。有关更多信息,请参阅

注3 计算效率更高的方法是先计算平均值,然后按月份排序。这样,您只需要对12项进行排序,而不需要对整个
df
进行排序。如果不需要对
df
进行排序,将降低计算成本


注4对于已经将
作为索引
的人,想知道如何将其分类,看看@jezrael有一个在中排序分类索引的工作示例,使用Sort_Dataframeby_month函数按时间顺序对月份名称进行排序

软件包需要安装

$ pip install sorted-months-weekdays
$ pip install sort-dataframeby-monthorweek
例如:

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_Month(df=df,monthcolumnname='Month')
Out[14]: 
  Month  Sum
0   Jan   23
1   Jan   16
2   Feb    3
3   Mar   53
4   Mar   12
5   Apr   79
6   Dec   35

使用Sort\u Dataframeby\u Month函数按时间顺序对月份名称进行排序

软件包需要安装

$ pip install sorted-months-weekdays
$ pip install sort-dataframeby-monthorweek
例如:

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_Month(df=df,monthcolumnname='Month')
Out[14]: 
  Month  Sum
0   Jan   23
1   Jan   16
2   Feb    3
3   Mar   53
4   Mar   12
5   Apr   79
6   Dec   35

您可以将数字月份值与索引中的名称(即“01一月”)一起添加,进行排序,然后去掉数字:

total=(df.groupby(df['date'].dt.strftime('%m %B'))['price'].mean()).sort_index()
它可能看起来像这样:

01 January  xxx
02 February     yyy
03 March    zzz
04 April    ttt

 total.index = [ x.split()[1] for x in total.index ]

January xxx
February yyy
March zzz
April ttt

您可以将数字月份值与索引中的名称(即“01一月”)一起添加,进行排序,然后去掉数字:

total=(df.groupby(df['date'].dt.strftime('%m %B'))['price'].mean()).sort_index()
它可能看起来像这样:

01 January  xxx
02 February     yyy
03 March    zzz
04 April    ttt

 total.index = [ x.split()[1] for x in total.index ]

January xxx
February yyy
March zzz
April ttt

我将使用
日历
模块和
重新索引

帮助将序列大写,然后我们使用
日历
模块创建一个字典,并使用序列获取月数

一旦我们有了月数,我们就可以得到指数。那么



我将使用
日历
模块和
重新索引

帮助将序列大写,然后我们使用
日历
模块创建一个字典,并使用序列获取月数

一旦我们有了月数,我们就可以得到指数。那么



<>你应该考虑基于轴0(索引)< /P>重新索引它。
<>你应该考虑基于轴0(索引)< /P>重新索引它。
您是否尝试过按答案所示对df.sort\u值进行排序(by='Date\u col',inplace=True)
。问题是在分组之后。它只是按字母顺序排列。好的,您是否尝试过在数据帧组内排序中概述的过程?在我的示例中,datetime的存在需要按月份进行转换,这使得很难实现如何将列首先映射到一系列索引(因此,对于每个月,在
months
数组中存储它是什么索引,而不是名称字符串),然后对这些数字进行排序?您是否尝试过
df.sort\u值(by='Date\u col',inplace=True)
,如答案所示?是的,我只是忘了提到它。问题在分组之后出现。然后按字母顺序出现。好的,你试过这个过程了吗