我尝试按月对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
- 它声称返回的索引不在索引中?
我已经打印了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
的索引。我的猜测是我必须首先对我的索引进行其他转换?
答案 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()]