首页 > 解决方案 > 使用多索引按时间段对数据帧进行分组

问题描述

我目前正在处理一个大型数据框,该数据框包含从 1941 年到 2019 年在巴西某些州每周发生的疾病。我想按州和特定时间段对它们进行分组,但我不能正确地做到这一点,因为我总是最终创建了一个我无法工作的多索引。

这是我的数据框的布局:

df.head()

df.head()

df.tail()

df.tail()

标签dt_sintoma是计算发生的时间段。

标签municipio是发生事件的状态,而co_municipio是关于这种状态的地理代码。

我正在尝试按州对它们进行分组,然后按时期(学期、月份、三个月等)对它们进行分组。

我试过了:

df.groupby(['municipio',df.index]).sum()

并得到:

在此处输入图像描述

现在我想按时期对它们进行分组,但现在我有一个多索引:

df.groupby(['municipio',df.index]).sum().index = 
MultiIndex([('Aracaju', '1950-08-06'),
            ('Aracaju', '1950-08-13'),
            ('Aracaju', '1950-08-20'),
            ('Aracaju', '1950-08-27'),
            ('Aracaju', '1950-09-03'),
            ('Aracaju', '1950-09-10'),
            ('Aracaju', '1950-09-17'),
            ('Aracaju', '1950-09-24'),
            ('Aracaju', '1950-10-01'),
            ('Aracaju', '1950-10-08'),
            ...
            ('Vitória', '2019-03-03'),
            ('Vitória', '2019-03-10'),
            ('Vitória', '2019-03-17'),
            ('Vitória', '2019-03-24'),
            ('Vitória', '2019-03-31'),
            ('Vitória', '2019-04-07'),
            ('Vitória', '2019-04-14'),
            ('Vitória', '2019-04-21'),
            ('Vitória', '2019-04-28'),
            ('Vitória', '2019-05-05')],
           names=['municipio', 'dt_sintoma'], length=118347)

我只是无法正确进行此分组。此外,当按某个时期分组并总结出现次数时,我无法总结co_municipio因为它是一个代码,不应该被修改。

标签: pandaspandas-groupbymulti-index

解决方案


我假设您将对几个不同的时期(和状态)进行分组。在我的回答中,我将展示如何按月(和州)分组。

出于测试目的,我创建了以下 DataFrame:

           municipio  occorencas
dt_sintoma                      
2019-04-14  Brasilia        1283
2019-04-21  Brasilia        1139
2019-05-05  Brasilia         547
2019-05-12  Brasilia          25
2019-04-10   Aracaju         100
2019-04-20   Aracaju         120
2019-06-12   Aracaju          50
2019-06-21   Aracaju          16
2018-01-10   Vitória          33
2018-01-20   Vitória          60

由于未使用州代码,因此我没有包含它。

要执行所需的分组,请运行:

df.set_index(df.index.to_period('M')).groupby(
    [pd.Grouper(freq='M'), 'municipio']).sum()

结果(对于我的测试数据)是:

                      occorencas
dt_sintoma municipio            
2018-01    Vitória            93
2019-04    Aracaju           220
           Brasilia         2422
2019-05    Brasilia          572
2019-06    Aracaju            66

如你看到的:

  1. 第一个技巧是将索引从确切日期更改为所需长度的期间,以具有像2019-04 之类 的期间标签(整个月,而不是2019-04-30 - 本月的最后一天)。
  2. 然后是具有相同频率( M)和municipio的索引的 2 级分组。
  3. 最后,对于每个组,计算出现的总和。

如果您想计算总和分组,例如按年份,请将M频率更改为Y (在两个地方)。

如果要先按州分组,然后按月分组,请反转groupby 参数:

['municipio', pd.Grouper(freq='M')]

推荐阅读