2 votes

Pandas : Comment normaliser le cadre de données COVID-19 avec des pays ayant des jours d'épidémie différents ?

Afin d'établir une comparaison significative entre les territoires, j'aimerais normaliser les cas confirmés COVID-19 en fonction de la date de début de l'épidémie dans les différents pays. Pour tout territoire, le jour où ce territoire atteint ou dépasse 10 cas confirmés est considéré comme le "jour 0 de l'épidémie".

Exemple de cadre de données :

[in]
import pandas as pd
confirmed_cases = {'Date':['1/22/20', '1/23/20', '1/24/20', '1/25/20', '1/26/20'], 'Australia':[0, 0, 0, 30, 50], 'Albania':[0, 20, 25, 30, 50], 'Algeria':[25, 40, 50, 50, 70]}
df = pd.DataFrame(confirmed_cases)
df

[out]
    Date    Australia   Albania     Algeria
0   1/22/20        0         0          25
1   1/23/20        0        20          40
2   1/24/20        0        25          50
3   1/25/20       30        30          50
4   1/26/20       50        50          70

Résultats souhaités :

    Day Since Outbreak     Australia    Albania     Algeria
0           0                    30         20          25
1           1                    50         25          40
2           2                   NaN         30          50
3           3                   NaN         50          50
4           4                   NaN        NaN          70

Existe-t-il un moyen d'effectuer cette tâche avec de simples lignes de code Python/Panda ?

4voto

Haleemur Ali Points 11798

Trouver la valeur de l'indice de la première valeur dépassant le seuil (10) pour chaque pays et décaler chaque colonne vers le haut de ce nombre

df2 = df[['Australia', 'Albania', 'Algeria']].apply(lambda x: x.shift(-(x > 10).idxmax()))
# df2
   Australia  Albania  Algeria
0       30.0     20.0       25
1       50.0     25.0       40
2        NaN     30.0       50
3        NaN     50.0       50
4        NaN      NaN       70

réinitialiser l'index pour obtenir la colonne jour depuis

df2.reset_index().rename(columns={'index': 'Day Since Outbreak'})

   Day Since Outbreak  Australia  Albania  Algeria
0                   0       30.0     20.0       25
1                   1       50.0     25.0       40
2                   2        NaN     30.0       50
3                   3        NaN     50.0       50
4                   4        NaN      NaN       70

1voto

ALollz Points 23271

Déterminez combien de fois vous devez shift chaque colonne en fonction de la première série de valeurs < 10. Puis on les décale. Le site cummin assure que s'il y a une valeur intermittente < 10, elle n'est pas comptée dans le calcul de la shift

df = df.drop(columns='Date')  # Wont need
s = df.lt(10).cummin().sum()

for col, shift in s.iteritems():
    df[col] = df[col].shift(-shift)

df['Days Since'] = range(len(df)) # Duplicative with index...

   Australia  Albania  Algeria  Days Since
0       30.0     20.0       25           0
1       50.0     25.0       40           1
2        NaN     30.0       50           2
3        NaN     50.0       50           3
4        NaN      NaN       70           4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X