如何按(月+年)转换为 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?

按月份名称对 pandas 数据框系列进行排序

如何使用 pandas 将多个 Xpath 转换为数据框?

仅从数据框中选择每个月的最后一周 - Python/Pandas

使用 pandas 数据框按时间顺序转换日期

Pandas:如何按一组序数值对数据框进行分组?