Как применить функцию к информационному фрейму в пандах? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть df, в котором хранятся медицинские записи, и мне нужно определить первый сайт, на который человек заходит после даты выписки.Df сгруппирован по идентификатору.

Есть 3 варианта: (1) внутри группы, если какая-либо из строк имеет начало_даты, совпадающее с первыми строками, конец_даты возвращает это местоположение как первый сайт (если естьдве строки, которые удовлетворяют этому условию, либо являются правильными).(2) если первая опция не существует, выберите первое местоположение после исходного местоположения (3) в противном случае, если условия 1 и 2 не существуют, верните «Домой»

ID    color  begin_date    end_date     location
1     red    2017-01-01    2017-01-07   initial
1     green  2017-01-05    2017-01-07   nursing
1     blue   2017-01-07    2017-01-15   rehab
1     red    2017-01-11    2017-01-22   Health
2     red    2017-02-22    2017-02-26   initial
2     green  2017-02-26    2017-02-28   nursing
2     blue   2017-02-26    2017-02-28   rehab
3     red    2017-03-11    2017-03-22   initial
4     red    2017-04-01    2017-04-07   initial
4     green  2017-04-05    2017-04-07   nursing
4     blue   2017-04-10    2017-04-15   Health

Ожидаемый результат:

ID   first_site
1    rehab
2    nursing
3    home
4    nursing

Моя попытка ниже.Я получаю ошибку "None of [Int64Index([8], dtype='int64')] are in the [index]" с небольшой онлайн-справкой об ошибке.Если я уберу условие elif относительно val2, я не столкнусь с ошибкой.

def First(x):
   #compare each group first and see if there are any locations that match 
   val = x.loc[x['begin_date'] == x['end_date'].iloc[0], 'location']
   #find the first location after the initial stay
   val2 = x.loc[x[x.location=='initial'].index+1, 'location']
   if not val.empty:
       return val.iloc[0]
   elif not val2.empty:
       return val2.iloc[0]
   else:
       return 'Home'

final = df.groupby('ID').apply(First).reset_index(name='first_site')
print (final)

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

1 Ответ

0 голосов
/ 27 мая 2018

'ID' == 3 имеет только одну строку - выражение val2 пытается индексировать позицию, которой там нет.

Проверьте, есть ли в группе только одна строка.

def First(x):
    if len(x) == 1:
        return_value = 'Home'
    else:
        val = x.loc[x['begin_date'] == x['end_date'].iloc[0], 'location']
        val2 = x.loc[x[x.location=='initial'].index+1, 'location']
        if not val.empty:
            return_value =  val.iloc[0]
        elif not val2.empty:
            return_value =  val2.iloc[0]
    return return_value

gb = df.groupby('ID')

>>> gb.apply(First)
ID
1      rehab
2    nursing
3       Home
4    nursing
dtype: object
>>>
...