Сводка данных за каждый месяц

#python #pandas

Вопрос:

У меня есть данные о диагностике состояния здоровья за прошлый год, и мне нравилось подсчитывать диагноз за каждый месяц. Вот мои данные:

 import pandas as pd

cars2 = {'ID': [22,100,47,35,60],
    'Date': ['2020-04-11','2021-04-12','2020-05-13','2020-05-14', '2020-06-15'],
        'diagnosis': ['bacteria sepsis','bacteria sepsis','Sepsis','Risk sepsis','Neonatal sepsis'],
        'outcome': ['alive','alive','dead','alive','dead']
        
        }

df2 = pd.DataFrame(cars2, columns = ['ID','Date', 'diagnosis', 'outcome'])

print (df2)
 

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

Комментарии:

1. «Сводка» — это общее слово для описательной статистики.. Вы хотите достичь определенного результата (например, вашего примера) или он более общий? Как должен выглядеть желаемый результат?

2. @Ric Привет, я углубился в конкретную область. Мне действительно нравилось получать показатели стоимости диагностики за каждый месяц

3. вы хотите outcome также посчитать случаи каждого из них?

4. Включение ожидаемого результата в ваш вопрос действительно может улучшить качество ответа, уточнив, какую форму вы ожидаете получить в результате.

5. @meowulf да, результат тоже

Ответ №1:

Если вы хотите видеть результаты за месяц, вы можете использовать pivot_table .

 df2.pivot_table(index=['outcome','diagnosis'], columns=pd.to_datetime(df2['Date']).dt.month, aggfunc='size', fill_value=0)
 

 Date                     4  5  6
outcome diagnosis               
alive   Risk sepsis      0  1  0
        bacteria sepsis  2  0  0
dead    Neonatal sepsis  0  0  1
        Sepsis           0  1  0
 

4,5,6-это месяцы в вашем наборе данных.

Попробуйте поиграть с параметрами здесь, возможно, вы сможете получить лучший вид, который лучше соответствует вашему идеальному результату.

Ответ №2:

Я изменил ваш фрейм данных, установив Date столбец в качестве индекса:

 import pandas as pd

cars2 = {'ID': [22,100,47,35,60],
    'Date': ['2020-04-11','2021-04-12','2020-05-13','2020-05-14', '2020-06-15'],
        'diagnosis': ['bacteria sepsis','bacteria sepsis','Sepsis','Risk sepsis','Neonatal sepsis'],
        'outcome': ['alive','alive','dead','alive','dead']
        }

df2 = pd.DataFrame(cars2, columns = ['ID','Date', 'diagnosis', 'outcome'])
df2.index = pd.to_datetime(df2['Date']) # <--- I set your Date column as the index (also convert it to datetime)
df2.drop('Date',inplace=True, axis=1) # <--- Drop the Date column
print (df2)
 

если вы groupby кадр данных с помощью pd.Grouper и столбцы, которые вы хотите сгруппировать ( diagnosis и outcome ):

 df2.groupby([pd.Grouper(freq='M'), 'diagnosis','outcome']).count()
 

Выход:

                                     ID
Date       diagnosis       outcome    
2020-04-30 bacteria sepsis alive     1
2020-05-31 Risk sepsis     alive     1
           Sepsis          dead      1
2020-06-30 Neonatal sepsis dead      1
2021-04-30 bacteria sepsis alive     1
 

Примечание: freq='M' в pd.Grouper группирует фрейм данных по месяцам. Подробнее об freq атрибуте читайте здесь

Изменить: Назначение сгруппированного фрейма данных new_df и сброс других индексов, кроме Date :

 new_df = df2.groupby([pd.Grouper(freq='M'), 'diagnosis','outcome']).count()
new_df.reset_index(level=[1,2],inplace=True)
 

Повторите каждый месяц и получите таблицу отдельно внутри df_list :

 df_list = [] # <--- this will contain each separate table for each month
for month in np.unique(new_df.index):
    df_list  = [pd.DataFrame(new_df.loc[[month]])]
df_list[0] # <-- get the first dataframe in df_list
 

будет возвращать:

                   diagnosis outcome  ID
Date                                   
2020-04-30  bacteria sepsis   alive   1
 

Комментарии:

1. Можно ли сделать цикл и иметь таблицы каждого месяца отдельно, чтобы я мог экспортировать их в слайд-шоу?

Ответ №3:

Сначала вам нужно создать month переменную через to_datetime() функцию; затем вы можете сгруппировать по месяцам и сделать в value_counts() течение месяца

 import pandas as pd

df2['month'] = pd.to_datetime(df2['Date']).dt.month
df2.groupby('month').apply(lambda x: x['diagnosis'].value_counts())

month                 
4      bacteria sepsis    2
5      Risk sepsis        1
       Sepsis             1
6      Neonatal sepsis    1
Name: diagnosis, dtype: int64
 

Ответ №4:

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

Сначала мы создаем столбец «год-месяц» в соответствии с этим Date столбцом. Затем используйте .groupby() этот новый year-month столбец и перейдите .value_counts() в столбец diagnosis , как показано ниже:

 df2['year-month'] = pd.to_datetime(df2['Date']).dt.strftime("%Y-%m")
df2.groupby('year-month')['diagnosis'].value_counts().to_frame(name='Count').reset_index()
 

Результат:

   year-month        diagnosis  Count
0    2020-04  bacteria sepsis      1
1    2020-05      Risk sepsis      1
2    2020-05           Sepsis      1
3    2020-06  Neonatal sepsis      1
4    2021-04  bacteria sepsis      1