PANDAS - Как узнать прошедшие дни после группы - PullRequest
0 голосов
/ 08 мая 2020

Я новичок в 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)

Ответы [ 2 ]

0 голосов
/ 08 мая 2020

Начнем с некоторых исправлений вашего «исходного» кода:

  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() создает только 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 голосов
/ 08 мая 2020

Для тех, у кого такая же проблема:

#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 

EDIT : с участием 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...