#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