Pandas - Подграфик каждой группы по серии по столбцу Дата, где количество строк в каждой группе разное - PullRequest
0 голосов
/ 07 мая 2020

У меня есть файл csv, который я прочитал в Pandas Dataframe. Фрейм данных (скажем, cdata) имеет следующие столбцы

Dataframe extract

Я хочу иметь возможность группировать эти данные по состоянию и строить подзаголовок кумулятивного подтвержденного столбца данные для каждого состояния на одном графике. Данные будут нанесены на столбец «Дата».

Распределение данных по столбцу «Дата» не является равномерным, т.е. не все штаты будут иметь строку данных для каждой даты.

Grouped by Date

Когда я пытаюсь построить подзаговор, используя нижеприведенные данные, это выглядит некорректно.

fig,ax = plt.subplots(figsize=(8,6))
count=1;
for state,df in cdata.groupby('State'):
    if(count < 5):
        df.plot(x='Date', y='Confirmed', ax=ax, label=state)
        count = count +1

plt.legend()

Result

Очевидно, это не выглядит нормально, поскольку, если я посмотрю на данные, совокупная цифра для State = 'Andhra Prade sh' 1 мая - 1463 г., а не ~ 400, на что, как кажется, указывает построенный график.

Что я здесь делаю не так?

Ответы [ 2 ]

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

Я смог достичь результата, которого искал, с помощью приведенного ниже кода. Однако я уверен, что это не самый элегантный способ добиться того же, и я все еще ищу альтернативы, которые более интуитивно понятны.

grouped = cdata.groupby(['Date','State'],sort=False)['Confirmed'].sum().unstack('State')
grouped.reset_index(inplace=True)
columns = grouped.columns.to_list()[1:-1]
fig,ax = plt.subplots(figsize=(20,14))
grouped.plot(x='Date',y=columns, ax=ax)

enter image description here

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

Вы наносите на график ежедневное подтвержденное число, а не совокупную сумму подтвержденных. Вы можете добавить новый столбец с кумулятивной суммой и вместо этого построить график.

Кроме того, обязательно установите столбец «Дата» как тип даты и отсортируйте его перед вычислением кумулятивной суммы, вы можете сделать что-то вроде это:

## Transform 'Date' to datetime
df['Date'] = pd.to_datetime(df['Date'])

## Sort the df by the 'Date' column
df.sort_values('Date', inplace=True)

## Calculate cumulative sum of 'Confirmed' by state
df['Total Confirmed'] = df.groupby('State')['Confirmed'].transform('cumsum');

## Plot
fig,ax = plt.subplots(figsize=(8,6))
count=1
for state, df in cdata.groupby('State'):
    if(count < 5):
        df.plot(x='Date', y='Total Confirmed', ax=ax, label=state)
        count = count + 1

plt.legend()
...