如何在pandas中使用groupby计算过去14天的平均值?

问题描述 投票:0回答:1

我希望能够计算菲律宾各城市Covid-19病例的增长率。我使用的是卫生部的公共病例数据集,其中包含病例ID、病例被确认的日期、病例所在的城市等信息。

我试着使用groupby方法将数据分成城市和日期,计算每天的病例,计算这些计数的累积总和,每天的百分比变化,最后计算过去14天的百分比变化的平均值。

我能够做到这些,但我想不通的是,如何再将它们组合成一个包含城市及其过去14天平均增长率的数据集。

这是我目前的情况。

import pandas as pd

cases_df = pd.read_csv('https://storage.googleapis.com/doh_datadrops/DOH%20Data%20Drop%2020200518.csv',
                      parse_dates=[5,6,7,9,17])

#cast data to appropriate types for easy handling
for col in ['AgeGroup', 'Sex','RemovalType', 'Admitted', 'RegionRes','ProvRes','CityMunRes',
            'CityMuniPSGC','HealthStatus','Quarantined','Pregnanttab']:
    cases_df[col] = cases_df[col].astype('category')
for col in ['DateRepConf', 'DateDied', 'DateRecover', 'DateRepRem','DateOnset']:
    cases_df[col] = cases_df[col].astype('datetime64')
cases_df.Age = cases_df.Age.astype('Int64')

list_cases_by_city_by_date = cases_df.groupby(['CityMunRes','DateRepConf'])['CaseCode'].count().cumsum().pct_change()

最后一个groupby产生了一个多索引列表。

CityMunRes  DateRepConf
ABUCAY      2020-01-30     NaN
            2020-02-03     NaN
            2020-02-05     NaN
            2020-03-06     NaN
            2020-03-07     NaN
                          ... 
ZARRAGA     2020-05-14     0.0
            2020-05-15     0.0
            2020-05-16     0.0
            2020-05-17     0.0
            2020-05-18     0.0
Name: CaseCode, Length: 28336, dtype: float64

现在我可以用下面的代码来计算过去14天的增长率 如果我指定了城市。

list_cases_by_city_by_date.loc['ABUCAY'].tail(14).mean()
0.03571428571428571

但我想要的是一个简单的数据框架,以 "CityMunRes "和 "Ave_Growth "为列,看起来像这样。

|   | City   | Ave_Growth |
|---|--------|------------|
| 0 | ABUCAY | 0.03       |
| 1 | Bxxxx  | 0.02       |
| 2 | Cxxxx  | 0.50       |
|   | ...    |            |
| n | Zxxx   | 0.2        |

但我遇到了一个初学者的问题。我相信解决方案很简单:)

请帮助我。

谢谢你的帮助。

python pandas pandas-groupby
1个回答
0
投票

编辑。 更好的解决方案。

list_cases_by_city_by_date.groupby(level=0).apply(lambda x: x.tail(14).mean())

这样如何? 你用你的那段代码给每个人做一个字典,然后把它们都扔到一个数据框架里。

d = {city: list_cases_by_city_by_date.loc[city].tail(14).mean() 
     for city in list_cases_by_city_by_date.index.get_level_values('CityMunRes')}

pd.DataFrame(data=d.values(), index=d.keys(), columns=['mean'])

编辑: 顺便说一下,当我尝试运行你提供的代码时,我得到的是 0.75,不 0.03571428571428571 当我运行

list_cases_by_city_by_date.loc['ABUCAY'].tail(14).mean()
© www.soinside.com 2019 - 2024. All rights reserved.