如何按(月+年)转换为 Pandas 数据框进行分组?
Posted
技术标签:
【中文标题】如何按(月+年)转换为 Pandas 数据框进行分组?【英文标题】:How can I make a group by (month + year) converting into a Pandas dataframe? 【发布时间】:2021-05-12 08:25:56 【问题描述】:我正在尝试从 pandas 数据框中获取平均值并将其转换为新的数据框,其中包含按月 + 年分组的列的平均值。所以我找到了这个答案:pandas dataframe groupby datetime month,但它并没有完全解决问题。
这就是我所拥有的:
dt grade
2020-01-01 10
2020-01-02 20
2020-02-01 30
2020-02-01 40
2020-03-01 10
2020-03-04 20
这就是我想要的:
dt grade_mean
2020-01 15
2020-02 35
2020-03 15
我还希望能够按天或按周分组,并获得一个数据框作为输出。所以这就是我到目前为止所做的:
df = pd.to_datetime(df['dt'], format="%m/%d/%y %I:%M%p")
df_grouped = df.groupby(by=[df.index.month, df.index.year])
df_grouped.grade.mean()
快完成了,但还是无法获取数据帧。
【问题讨论】:
【参考方案1】:首先将您的日期转换为日期时间类型:
# this code is wrong, you overwrite `df`
# df = pd.to_datetime(df['dt'], format="%m/%d/%y %I:%M%p")
# use
df['dt'] = pd.to_datetime(df['dt'])
# and groupby with two keys can be a lot slower than with just one
# df_grouped = df.groupby(by=[df.index.month, df.index.year])
尝试使用to_period
:
out = df.groupby(pd.to_datetime(df['dt']).dt.to_period('M')).mean()
另外,pd.Grouper
在接受的答案中会很好:
# also `W` for week and `D` for day
out = df.groupby(pd.Grouper(freq='M', key='dt')).mean()
【讨论】:
【参考方案2】:一种方法,当您评估一个字符串而不是一个整数时可能会非常昂贵
是在你的日期时间对象上使用dt.strftime
。
# assuming `dt` is already a a datetime object.
# df['dt'] = pd.to_datetime(df['dt'],format='%Y-%m-%d')
df.groupby([df['dt'].dt.strftime('%Y-%m')])['grade'].mean().reset_index()
dt grade
0 2020-01 15
1 2020-02 35
2 2020-03 15
【讨论】:
以上是关于如何按(月+年)转换为 Pandas 数据框进行分组?的主要内容,如果未能解决你的问题,请参考以下文章
在 Python/Pandas 中,如何将世纪月转换为 DateTimeIndex?