pandas - 使用多索引按时间段对数据帧进行分组
问题描述
我目前正在处理一个大型数据框,该数据框包含从 1941 年到 2019 年在巴西某些州每周发生的疾病。我想按州和特定时间段对它们进行分组,但我不能正确地做到这一点,因为我总是最终创建了一个我无法工作的多索引。
这是我的数据框的布局:
df.head()
:
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因为它是一个代码,不应该被修改。
解决方案
我假设您将对几个不同的时期(和状态)进行分组。在我的回答中,我将展示如何按月(和州)分组。
出于测试目的,我创建了以下 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
如你看到的:
- 第一个技巧是将索引从确切日期更改为所需长度的期间,以具有像2019-04 之类 的期间标签(整个月,而不是2019-04-30 - 本月的最后一天)。
- 然后是具有相同频率( M)和municipio的索引的 2 级分组。
- 最后,对于每个组,计算出现的总和。
如果您想计算总和分组,例如按年份,请将M频率更改为Y (在两个地方)。
如果要先按州分组,然后按月分组,请反转groupby 参数:
['municipio', pd.Grouper(freq='M')]
推荐阅读
- spring - Spring - 尝试将新员工插入到 mySQL - 绑定参数 [1] 作为 [VARCHAR] - [null]
- java - 扩展非抽象 jpa 实体类
- javascript - 在 React 中打补丁后更新状态
- c# - 使用参数中的日期从 c# 调用存储过程
- amazon-s3 - Amazon S3 的端点是什么?
- ios - 如何根据 UITableViewCell 中的内容调整水平 UICollectionView 的高度
- r - 在 Azure Data Lake Analytics 中安装 R 包
- javascript - 需要将我的供应商 ID 分配给 InvoiceTable - 一对多关系
- angular - 图像未在 Angular 应用程序上加载
- c# - 使用实体框架从数据库中获取行到列表