我是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)
让我们从对你的 "初始 "代码的一些修正开始。
在... groupby
你已经对你的数据进行了分类,所以covid_data.sort_values(by=['Country/Region', 'Date'])
其实这个指令并没有改变什么,因为你没有通过inplace=True 参数。
现在,当 日期 在索引中,现在是消除其他列中所有为零的记录的时候了,所以执行 covid_data = covid_data[(covid_data.T != 0).any()]
重置索引之前。
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
对于有同样问题的人来说:
#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