【问题标题】:How calculate mean of last 14 days using groupby in pandas如何在熊猫中使用 groupby 计算过去 14 天的平均值
【发布时间】:2020-09-05 07:24:33
【问题描述】:

我希望能够计算菲律宾每个城市的 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】:

    编辑:更好的解决方案:

    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()
    

    【讨论】:

    • 谢谢@Bertil。有用。 (顺便说一句,您的代码产生了相同的平均值 0.0357)。我想知道是否有办法在 groupby 中链接 agg 方法来做同样的事情。
    • 嗯,奇怪。不确定。顺便说一句,如果这回答了您的问题,请单击此答案左侧的灰色复选标记以将其标记为已接受。
    • 嗨@bertil 感谢您的建议和帮助。我仍在寻找一种通过 grouby agg 方法来做到这一点的方法。如果我暂时保持打开状态,您可以吗?谢谢。
    • 更新了我的答案@gio888
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-18
    • 2016-04-03
    • 2018-04-29
    • 2023-02-17
    • 2021-02-27
    相关资源
    最近更新 更多