Pandas: Как нормализовать фрейм данных COVID-19 в разных странах с разным днем ​​вспышки - PullRequest
2 голосов
/ 29 апреля 2020

Для того, чтобы провести значимое сравнение по территориям, я хотел бы нормализовать случаи, подтвержденные COVID-19, по дате начала вспышки в разных странах. Для любой территории день, когда эта территория достигает или превышает 10 подтвержденных случаев, считается «днем 0 вспышки».

Пример кадра данных:

[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

Желаемые результаты:

    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

Есть ли способы выполнить эту задачу с помощью простых строк кода Python / Panda?

Ответы [ 2 ]

4 голосов
/ 29 апреля 2020

найдите значение индекса первого значения, превышающего пороговое значение (10) для каждой страны, и сдвиньте каждый столбец вверх на столько

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

сбросьте индекс, чтобы получить столбец с начала дня

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
1 голос
/ 29 апреля 2020

Определите, сколько раз вам нужно shift каждый столбец, основываясь на первом прогоне значений <10. Затем сдвиньте их. <code>cummin гарантирует, что если есть неустойчивое значение <10, оно не учитывается в <code>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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...