2016-06-08 124 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和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'> 

我已经转换使用pd.to_datetime我的约会指数为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()]