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会将规范的顺序记录为默认排序顺序.
文档:熊猫类别> 排序和订单.
感谢@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)
| 归档时间: |
|
| 查看次数: |
10209 次 |
| 最近记录: |