【问题标题】:PANDAS - How to get elapased days after group byPANDAS - 如何在分组后获得经过的天数
【发布时间】:2020-05-10 00:21:50
【问题描述】:

我是 python 和 pandas 的新手。 我很难按国家/地区列出自第一个案例发生以来经过的天数。类似于日期列,但我想要的不是日期,而是第一个案例以来的天数(自一个国家内首次发生病例/死亡/康复)

我已按国家和日期对数据进行分组,并对确诊病例、死亡病例和康复病例进行了汇总。 (因为原始数据有一些国家与地区分开)我还删除了没有死亡,康复或死亡的日子(我想从第一个病例出现起算)。

如果有任何帮助,我将不胜感激!提前致谢!

covid_data = covid_data.groupby(['Country/Region', 'Date'])[['Confirmed', 'Deaths', 'Recovered']].apply(sum)
covid_data.sort_values(by=['Country/Region', 'Date'])
covid_data.reset_index()
covid_data = covid_data[(covid_data.T != 0).any()] #eliminates rows with no suspected, no deaths and no cured

输出:

Country/Region  Date       Confirmed    Deaths  Recovered
Afghanistan     2020-02-24  1            0       0
                2020-02-25  1            0       0
                2020-02-26  1            0       0
                2020-02-27  1            0       0
                2020-02-28  1            0       0
                2020-02-29  1            0       0
                2020-03-01  1            0       0
                2020-03-02  1            0       0
                2020-03-03  1            0       0
                2020-03-04  1            0       0
(and many other countries)

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    让我们从对“初始”代码的一些更正开始:

    1. groupby 之后,您的数据已经排序,所以 不需要covid_data.sort_values(by=['Country/Region', 'Date'])。 实际上这个指令并没有改变任何东西,因为你没有通过 inplace=True 参数。

    2. 现在,当 Date 在索引中时,是时候消除全为零的行了 在其他列中,请运行covid_data = covid_data[(covid_data.T != 0).any()] 在重置索引之前。

    3. covid_data.reset_index()只生成一个带有reset index的DataFrame, 但也不会将其保存在任何地方。您应该将其更正为:

      covid_data.reset_index(inplace=True)
      

    现在让我们开始做主要任务。

    假设源数据,经过上述初始操作,包含:

      Country/Region       Date  Confirmed  Deaths  Recovered
    0           Aaaa 2020-02-24          2       1          0
    1           Aaaa 2020-02-25          2       0          0
    2           Aaaa 2020-02-26          1       0          0
    3           Aaaa 2020-02-27          3       0          0
    4           Aaaa 2020-02-28          4       0          0
    5           Bbbb 2020-02-20          5       1          0
    6           Bbbb 2020-02-21          7       0          0
    7           Bbbb 2020-02-23          9       1          0
    8           Bbbb 2020-02-24          4       0          0
    9           Bbbb 2020-02-25          8       1          0
    

    即2 个国家/地区。

    要计算每个国家/地区的 Elapsed 列,请定义以下函数:

    def getElapsed(grp):
        startDate = grp.iloc[0]
        return ((grp - startDate) / np.timedelta64(1, 'D')).astype(int)
    

    然后运行:

    covid_data['Elapsed'] = covid_data.groupby('Country/Region').Date.transform(getElapsed)
    

    结果是:

      Country/Region       Date  Confirmed  Deaths  Recovered  Elapsed
    0           Aaaa 2020-02-24          2       1          0        0
    1           Aaaa 2020-02-25          2       0          0        1
    2           Aaaa 2020-02-26          1       0          0        2
    3           Aaaa 2020-02-27          3       0          0        3
    4           Aaaa 2020-02-28          4       0          0        4
    5           Bbbb 2020-02-20          5       1          0        0
    6           Bbbb 2020-02-21          7       0          0        1
    7           Bbbb 2020-02-23          9       1          0        3
    8           Bbbb 2020-02-24          4       0          0        4
    9           Bbbb 2020-02-25          8       1          0        5
    

    【讨论】:

    • 非常感谢您的回答!我有几个问题:我应该运行指令以在重置索引之前删除全为零的行,因为我们只想检查死亡、恢复和 eleapsed 列? getElapsed 函数接收每一行的 Date 列的值作为参数,对吗? iloc 将选择组的第一个值(所以开始日期)?
    • 是的(对于您的所有问题)。
    • 最后一个问题:使用您计算经过天数的方式(而不是我想出的)有什么好处吗?感谢大家的耐心等待!
    • 计算“Elapsed”列的解决方案在哪里?您的代码示例仅包含“初始”操作。
    • 对不起,几个小时后我想出的答案:这个问题的另一个答案。
    【解决方案2】:

    对于任何有同样问题的人:

    #aggregates de countries by date
    covid_data = covid_data.groupby(['Country/Region', 'Date'])[['Confirmed', 'Deaths', 'Recovered']].apply(sum)
    
    #sorts the countries by name and then by date
    covid_data.sort_values(by=['Country/Region', 'Date'])
    
    #eliminates rows with no suspected, no deaths and no cured
    covid_data = covid_data[(covid_data.T != 0).any()] 
    
    #get group by columns back
    covid_data = covid_data.reset_index() 
    
    #substructs the mim date from the current date (and returns the result in days - dt.days)
    covid_data['Ellapsed Days'] = (covid_data['Date'] - covid_data.groupby('Country/Region')['Date'].transform('min')).dt.days 
    

    编辑:贡献Valdi_Bo

    #aggregates de countries by date
    covid_data = covid_data.groupby(['Country/Region', 'Date'])[['Confirmed', 'Deaths', 'Recovered']].apply(sum)
    
    #eliminates rows with no suspected, no deaths and no cured
    covid_data = covid_data[(covid_data.T != 0).any()] 
    
    #get group by columns back
    covid_data.reset_index(inplace=True) 
    
    #substructs the mim date from the current date (and returns the result in days - dt.days)
    covid_data['Ellapsed Days'] = (covid_data['Date'] - covid_data.groupby('Country/Region')['Date'].transform('min')).dt.days 
    

    【讨论】:

      猜你喜欢
      • 2017-10-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2016-04-09
      • 2017-08-11
      • 1970-01-01
      • 2019-09-03
      • 2019-12-26
      相关资源
      最近更新 更多