gpt4 book ai didi

python - 按月份名称和年份对 groupby pandas 输出进​​行排序

转载 作者:行者123 更新时间:2023-12-05 09:11:52 30 4
gpt4 key购买 nike

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 输出,所以我得到的是四月、八月、十二月、二月等……而不是一月、二月....直到 12 月等。如何按月数对输出进行排序。

需要像 2016 年、1 月、2 月....12 月,然后是 2017 年、1 月、2 月、3 月到 12 月这样的输出

如果有 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 - 按月份名称和年份对 groupby pandas 输出进​​行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59600271/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com