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)
,如答案所示?是的,我只是忘了提到它。问题在分组之后出现。然后按字母顺序出现。好的,你试过这个过程了吗