df.first_valid_index()返回引发KeyError的索引?

时间:2016-06-08 08:49:38

标签: python python-3.x pandas dataframe

我尝试按月对pd.DataFrame进行分组并应用自定义函数ultimo(x)

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之前,我已使用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的索引。我的猜测是我必须首先对我的索引进行其他转换?

1 个答案:

答案 0 :(得分: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()]