如何在Pandas数据框架中按周分组(附实例)

670 阅读3分钟

你可以使用下面的基本语法在pandas DataFrame中按周分组行

#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')

#calculate sum of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['values'].sum()

这个特殊的公式在日期列中按周对行进行分组,并计算DataFrame中数值列的数值之和。

下面的例子展示了如何在实践中使用这种语法。

例子:如何在Pandas中按周分组

假设我们有如下的pandas DataFrame,显示某个公司在不同日期的销售额。

import pandas as pd

#create DataFrame
df = pd.DataFrame({'date': pd.date_range(start='1/5/2022', freq='D', periods=15),
                   'sales': [6, 8, 9, 5, 4, 8, 8, 3, 5, 9, 8, 3, 4, 7, 7]})

#view DataFrame
print(df)

         date  sales
0  2022-01-05      6
1  2022-01-06      8
2  2022-01-07      9
3  2022-01-08      5
4  2022-01-09      4
5  2022-01-10      8
6  2022-01-11      8
7  2022-01-12      3
8  2022-01-13      5
9  2022-01-14      9
10 2022-01-15      8
11 2022-01-16      3
12 2022-01-17      4
13 2022-01-18      7
14 2022-01-19      7

相关的: 如何在Pandas中创建一个日期范围

我们可以使用下面的语法来计算按周分组的销售额之和:

#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')

#calculate sum of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['sales'].sum()

date
2022-01-02    32
2022-01-09    44
2022-01-16    18
Freq: W-SUN, Name: sales, dtype: int64

下面是解释输出的方法:

  • 在1/2/2022后一天开始的一周内,总共有32 笔销售
  • 从2022年1月9日开始的一周内,共有44 笔销售
  • 从2022年1月16日开始的一周内,共有18 笔销售

值得注意的是,在默认情况下,pandas假设一周从周日的第二天开始(W-SUN

然而,根据文档,你可以改变Freq的这个值。

例如,如果你想让每个星期从星期一的后一天开始(即星期二),你可以指定Freq=W-MON

我们可以使用类似的语法来计算按周分组的销售值的最大值。

#convert date column to datetime and subtract one week
df['date'] = pd.to_datetime(df['date']) - pd.to_timedelta(7, unit='d')

#calculate max of values, grouped by week
df.groupby([pd.Grouper(key='date', freq='W')])['sales'].max()

date
2022-01-02    9
2022-01-09    9
2022-01-16    7
Freq: W-SUN, Name: sales, dtype: int64

以下是如何解释输出结果的:

  • 从1/2/2022后一天开始的一周内,单日的最大销售额为9
  • 在2022年1月9日之后的一周内,单日最大销售额为9
  • 2022年1月16日之后的一天开始的一周内,单日最大销售额为7

注意:你可以在这里找到pandas中groupby操作的完整文档。

其他资源

下面的教程解释了如何在pandas中执行其他常见的操作:

如何在Pandas数据框架中按月分组
Pandas:如何使用Groupby和带条件计数