2016-06-08 2 views
1

Я пытаюсь группировать pd.DataFrame по месяцам и применить пользовательскую функцию ultimo(x):df.first_valid_index() возвращает индекс, который вызывает KeyError?

def ultimo(x): 
    if x.first_valid_index() is None: 
     return np.nan 
    else: 
     return x[x.first_valid_index()] 

Я получил это от другого question of mine. Однако сегодня я столкнулся с KeyError, применяя его - он утверждает, что возвращаемый индекс не находится внутри индекса?

Sample DataFrame as input

я напечатал, что х и x.first_valid_index() возвращает так:

x.index: <class 'pandas.tseries.index.DatetimeIndex'> 
x.index.values: ['2015-03-30T02:00:00.000000000+0200' '2015-03-31T02:00:00.000000000+0200'] <class 'numpy.ndarray'> of type <class 'numpy.datetime64'> 
x.first_valid_index(): 2015-03-30 00:00:00 <class 'pandas.tslib.Timestamp'> 

Я конвертированы мой индекс даты в DateTime, используя pd.to_datetime перед запуском navs = navs.groupby(navs.index.to_period('M')).apply(ultimo):

navs['Date'] = pd.to_datetime(navs['Date']) 
navs = navs.set_index('Date') 

Как это исправить? Кажется ироничным, что pd.first_valid_index() возвращает индекс, который вызывает KeyError. Я предполагаю, что сначала мне нужно сделать другое преобразование по моему индексу?

ответ

2

Это связано с тем, что в вашем предыдущем вопросе вход (и, следовательно, x) представляет собой серию, поэтому x[index] работает должным образом. Для фрейма данных x[index] ожидает имя столбца. Чтобы получить доступ к строке, индексированной индексом, вам нужно x.loc[index]. См. documentation here.

Эта функция будет работать:

def ultimo(x): 
    if x.first_valid_index() is None: 
     return np.nan 
    else: 
     return x.loc[x.first_valid_index()] 
Смежные вопросы