2017-01-06 3 views
1

Меня попросили проанализировать БД из приложения для медицинской записи. Так куча записи будет выглядеть следующим образом:Panda groupby на многих колонках с agg()

Table image

Так я должен возобновить более 3 миллионов записей с 2011 по 2014 год по РХ, я знаю, что они повторяют так Thats идентификатор для каждого пациента, поэтому пациент должно было быть много visitis к доктору. Как я могу группировать их или возобновлять их пациентом.

ответ

0

Я не знаю, что вы подразумеваете под «резюме», но похоже, что все, что вы хотите сделать, это только сортировать и отображать данные в лучшем виде. Вы можете визуально группа (= порядок) записи, «PX- и Fecha-накрест», как это:

df.set_index(['px', 'fecha'], inplace=True) 

EDIT:

При выполнении группирования данных, основанный на некоторой общей собственности, вы должны решить, какой тип агрегации вы собираетесь использовать для данных в других столбцах. Проще говоря, как только вы выполните группу, у вас есть только одно пустое поле для каждого оставшегося столбца для каждого «pacient_id» слева, поэтому вы должны использовать некоторую функцию агрегации (например, сумма, средняя, ​​мин, avg, count, ...) который вернет желаемое представляемое значение сгруппированных данных.

Трудно работать с вашими данными, поскольку они заблокированы в изображении, и невозможно сказать, что вы подразумеваете под «Возрастом», поскольку этот столбец не виден, но я надеюсь, что вы сможете достичь того, что хотите глядя на следующем примере с фиктивными данными:

import pandas as pd 
import numpy as np 
from datetime import datetime 
import random 
from datetime import timedelta 

def random_datetime_list_generator(start_date, end_date,n): 
    return ((start_date + timedelta(seconds=random.randint(0, int((end_date - start_date).total_seconds())))) for i in xrange(n)) 

#create random dataframe with 4 sample columns and 50000 rows 
rows = 50000 
pacient_id = np.random.randint(100,200,rows) 
dates = random_datetime_list_generator(pd.to_datetime("2011-01-01"),pd.to_datetime("2014-12-31"),rows) 
age = np.random.randint(10,80,rows) 
bill = np.random.randint(1,1000,rows) 

df = pd.DataFrame(columns=["pacient_id","visited","age","bill"],data=zip(pacient_id,dates,age,bill)) 

print df.head() 

# 1.Only perform statictis of the last visit of each pacient only 
stats = df.groupby("pacient_id",as_index=False)["visited"].max() 
stats.columns = ["pacient_id","last_visited"] 
print stats 

# 2. Perform a bit more complex statistics on pacient by specifying desired aggregate function for each column 
custom_aggregation = {'visited':{"first visit": 'min',"last visit": "max"}, 'bill':{"average bill" : "mean"}, 'age': 'mean'} 

#perform a group by with custom aggregation and renaming of functions 
stats = df.groupby("pacient_id").agg(custom_aggregation) 
#round floats 
stats = stats.round(1) 
print stats 

Оригинальный манекен dataframe выглядит так:

pacient_id    visited age bill 
0   150 2012-12-24 21:34:17 20 188 
1   155 2012-10-26 00:34:45 17 672 
2   116 2011-11-28 13:15:18 33 360 
3   126 2011-06-03 17:36:10 58 167 
4   165 2013-07-15 15:39:31 68 815 

Первый агрегат будет выглядеть следующим образом:

pacient_id  last_visited 
0   100 2014-12-29 00:01:11 
1   101 2014-12-22 06:00:48 
2   102 2014-12-26 11:51:41 
3   103 2014-12-29 15:01:32 
4   104 2014-12-18 15:29:28 
5   105 2014-12-30 11:08:29 

Во-вторых, комплекс агрегации будет выглядеть следующим образом:

     visited      age   bill 
        first visit   last visit mean average bill 
pacient_id               
100  2011-01-06 06:11:33 2014-12-29 00:01:11 45.2  507.9 
101  2011-01-01 20:44:55 2014-12-22 06:00:48 44.0  503.8 
102  2011-01-02 17:42:59 2014-12-26 11:51:41 43.2  498.0 
103  2011-01-01 03:07:41 2014-12-29 15:01:32 43.5  495.1 
104  2011-01-07 18:58:11 2014-12-18 15:29:28 45.9  501.7 
105  2011-01-01 03:43:12 2014-12-30 11:08:29 44.3  513.0 

Этот пример должен получить ты. Кроме того, есть хорошая SO question о агрегации групп pandas groupby, которая может многому научить вас по этим темам.

+0

Не совсем то, что я ищу. Позвольте мне посмотреть, могу ли я объяснить. Поэтому я хочу «свернуть или возобновить», например, все консультации у каждого пациента в 2011 году, чтобы в поле возраста i заканчивалось максимальное значение. Таким образом, по резюме я имею в виду, как запустить максимальную возрастную функцию возврата в возрасте по годам и заканчивать только с возрастом для каждого пациента в год. Я чист? – alex

+0

GREAT! Большое спасибо, это именно то, чего я отсутствовал. – alex

Смежные вопросы