Pandas dataframe 的按时间月份分组
在本文中,我们将介绍如何使用Pandas dataframe 中的 groupby
函数来按照时间月份对数据进行分组。
阅读更多:Pandas 教程
数据准备
首先,我们需要准备一些数据来进行演示。我们创建一个包含日期和数值两列的数据框:
import pandas as pd
import numpy as np
dates = pd.date_range(start='20210101', end='20211231')
values = np.random.randint(0, 100, size=365)
df = pd.DataFrame({'date':dates, 'value':values})
这样就生成了一个包含2021年每一天的数据框。
按月份分组
接下来,我们可以使用 groupby
函数按月份对数据进行分组。首先,我们需要将日期列的粒度缩小到月份。我们可以使用 pd.Grouper
函数来轻松完成这项工作。
df['month'] = df.groupby(pd.Grouper(key='date', freq='M'))['value'].transform('mean')
这里,我们将日期 date
列的粒度缩小至月份,并将每个月的平均值赋值给 month
列。其中:
key='date'
指明将日期列作为分组的关键字。freq='M'
指明指定的粒度为月份。transform('mean')
指明使用平均值函数对每个月的数据进行转换。
现在,我们已经成功地按月份分组并计算了每个月的平均值。下面来看一下生成的数据框。
print(df.head())
输出如下所示:
date value month
0 2021-01-01 85 54.677419
1 2021-01-02 10 54.677419
2 2021-01-03 0 54.677419
3 2021-01-04 5 54.677419
4 2021-01-05 89 54.677419
可以看到,在 month
列中,每个月的平均值已经被计算了出来。
筛选数据
接下来,我们可以根据月份的平均值筛选出特定的数据。例如,我们可以筛选出月份平均值大于70的数据。
df_high_value = df[df['month']>70]
这里,我们可以使用 Pandas 内置的条件筛选功能。df['month']>70
相当于创建了一个 True
或 False
的Series,该Series将被传递给原始数据框以筛选出符合条件的行。
现在,我们已经筛选出了 month
大于70的行。下面来看一下筛选出来的数据框。
print(df_high_value.head())
输出如下所示:
date value month
0 2021-01-01 85 54.677419
4 2021-01-05 89 54.677419
5 2021-01-06 90 54.677419
6 2021-01-07 27 54.677419
10 2021-01-11 75 54.677419
这里,我们可以看到只有月份平均值大于70的行被筛选出来了。
总结
到此为止,我们已经介绍了如何使用 Pandas dataframe 中的 groupby
函数来按照时间月份对数据进行分组的方法。希望这篇文章能够对你运用 Pandas 处理时间序列数据时有所帮助。