按月份名称对熊猫的数据框系列进行排序?

J_p*_*J_p 8 python sorting date dataframe pandas

我有一个Series对象,它具有:

    date   price
    dec      12
    may      15
    apr      13
    ..
Run Code Online (Sandbox Code Playgroud)

问题陈述:我希望按月显示并计算每个月的平均价格,并按月按排序方式显示.

期望的输出:

 month mean_price
  Jan    XXX
  Feb    XXX
  Mar    XXX
Run Code Online (Sandbox Code Playgroud)

我想要制作一个列表并将其传递给sort函数:

months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
Run Code Online (Sandbox Code Playgroud)

sort_values不支持系列.

我遇到的一个大问题是,尽管如此

df = df.sort_values(by='date',ascending=True,inplace=True)工作到最初,df但在我做了之后groupby,它没有保持从排序中出来的订单df.

总之,我需要从初始数据框这两列.使用月份(dt.strftime('%B'))对datetime列和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
Run Code Online (Sandbox Code Playgroud)

Bra*_*mon 12

您可以使用分类数据来启用正确的排序:

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
Run Code Online (Sandbox Code Playgroud)

指定类别时,pandas会将规范的顺序记录为默认排序顺序.

文档:熊猫类别> 排序和订单.


Tai*_*Tai 5

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

注意 1 @Brad Solomon's answer usingpd.categorical应该比我的答案更节省您的资源。他展示了如何为您的分类数据分配顺序。你不应该错过它: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
Run Code Online (Sandbox Code Playgroud)

Note 2 groupby默认情况下会为您排序组键。请注意在 和 中使用相同的键进行排序和分组df = df.sort_values(by=SAME_KEY)total = (df.groupby(df[SAME_KEY])['Price'].mean()).否则可能会出现意外行为。请参阅Groupby 保留组之间的顺序?用哪种方法?想要查询更多的信息。

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

注 4对于已经有monthas index并且想知道如何将其分类的人,请查看pandas。CategoricalIndex@jezrael 有一个在Pandas 系列中按月索引排序分类索引的工作示例


小智 5

您应该考虑根据轴 0(索引)重新索引它

new_order = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']

df1 = df.reindex(new_order, axis=0)
Run Code Online (Sandbox Code Playgroud)