PANDAS - 如何获得组后的已过天数?

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

我是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个回答
0
投票

让我们从对你的 "初始 "代码的一些修正开始。

  1. 在... groupby 你已经对你的数据进行了分类,所以covid_data.sort_values(by=['Country/Region', 'Date']) 其实这个指令并没有改变什么,因为你没有通过inplace=True 参数。

  2. 现在,当 日期 在索引中,现在是消除其他列中所有为零的记录的时候了,所以执行 covid_data = covid_data[(covid_data.T != 0).any()]重置索引之前。

  3. covid_data.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个国家和地区

要计算 历时 列,为每个国家地区定义以下函数。

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

0
投票

对于有同样问题的人来说:

#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 
© www.soinside.com 2019 - 2024. All rights reserved.