python - 按月份名称和年份排序 groupby pandas 输出
问题描述
df
order_date Month Name Year Days Data
2015-12-20 Dec 2014 1 3
2016-1-21 Jan 2014 2 3
2015-08-20 Aug 2015 1 1
2016-04-12 Apr 2016 4 1
and so on
代码:
df = df.groupby(["Year", "Month Name"], as_index=False)["days"].agg(['min',
'mean'])
df3 = (df.groupby(["Year", "Month Name"], as_index=False)
["Data"].agg(['count']))
merged_df=pd.merge(df3, df, on=['Year','Month Name'])
我有一个 groupby 输出如下
Min Mean Count
Year Month Name
2015 Aug 2 11 200
Dec 5 13 130
Feb 3 15 100
Jan 4 20 123
May 1 21 342
Nov 2 12 234
2016 Apr 1 10 200
Dec 2 12 120
Feb 2 13 200
Jan 2 24 200
Sep 1 25 220
问题:
基本上,我得到了按从 A 到 Z 的月份名称排序的 groupby 的输出,所以我得到的是 April、August、December、Feb 等......而不是 Jan、Feb ......直到 Dec 等。如何获取按月数排序的输出。
我需要像 2016, Jan, Feb ....Dec 然后 2017, Jan, Feb, Mar 到 Dec
如果合并 2 个 dfs,请提供帮助。我刚刚在这里展示了一个简化的代码(实际代码不同,我需要将两者合并,然后只有我可以工作)
解决方案
编辑:你的解决方案应该改变:
df1 = df.groupby(["Year", "Month Name"], as_index=False)["Days"].agg(['min', 'mean'])
df3 = df.groupby(["Year", "Month Name"], as_index=False)["Data"].agg(['count'])
merged_df=pd.merge(df3, df1, on=['Year','Month Name']).reset_index()
cats = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
merged_df['Month Name'] = pd.Categorical(merged_df['Month Name'],categories=cats, ordered=True)
merged_df = merged_df.sort_values(["Year", "Month Name"])
print (merged_df)
Year Month Name count min mean
1 2014 Jan 1 2 2
0 2014 Dec 1 1 1
2 2015 Aug 1 1 1
3 2016 Apr 1 4 4
或者:
df1 = (df.groupby(["Year", "Month Name"])
.agg(min_days=("Days", 'min'),
avg_days=("Days", 'mean'),
count = ('Data', 'count'))
.reset_index())
cats = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
df1['Month Name'] = pd.Categorical(df1['Month Name'], categories=cats, ordered=True)
df1 = df1.sort_values(["Year", "Month Name"])
print (df1)
Year Month Name min_days avg_days count
1 2014 Jan 2 2 1
0 2014 Dec 1 1 1
2 2015 Aug 1 1 1
3 2016 Apr 4 4 1
最后一个MultiIndex
没有分类的解决方案,解决方案创建帮助日期列并按其排序:
df1 = (df.groupby(["Year", "Month Name"])
.agg(min_days=("Days", 'min'),
avg_days=("Days", 'mean'),
count = ('Data', 'count'))
)
df1['dates'] = pd.to_datetime([f'{y}{m}' for y, m in df1.index], format='%Y%b')
df1 = df1.sort_values('dates')
print (df1)
min_days avg_days count dates
Year Month Name
2014 Jan 2 2 1 2014-01-01
Dec 1 1 1 2014-12-01
2015 Aug 1 1 1 2015-08-01
2016 Apr 4 4 1 2016-04-01
推荐阅读
- python - 在 Python Flask 中显示关注的用户帖子时出现问题
- ruby - 如何使手动工作始终在 GitLab CI 上成功退出?
- c# - 过于频繁地设置 Label.Text 会导致应用程序崩溃 - Xamarin.Forms
- mysql - 索引列可为空的 MySql
- sql - 子查询的 IN 子句参数
- azure - 如何将 azure 链接的 VSTS/DevOps 移动到另一个帐户/azure 订阅
- java - 产生一个数字,使得该数字的位数应该是给定数组中数字的最大位数
- c - C语言,如何检查给定的输入是字符还是正整数
- javascript - 在 React 中,如何将 JSX 与返回更多 JSX 的 JS 函数一起返回?
- javascript - 为什么我的更改背景颜色的功能运行(警报有效),但不更改颜色?