在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?
Posted
技术标签:
【中文标题】在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?【英文标题】:In pandas expanding/rolling function, how to use the index of the a dataframe or series? 【发布时间】:2019-01-17 08:23:50 【问题描述】:假设我有一个带有日期时间索引的pandas.Series
:
srs = pd.Series(index = pd.date_range('2013-01-01','2013-01-10' )).fillna(1)
我可以使用expanding
函数来计算级数的扩展总和。
srs.expanding(5).sum()
但是,我无法使用扩展功能访问该系列的其他属性(比如它的索引)。例如通过运行:
srs.expanding(5).apply(lambda x: x.index[-1])
我得到错误:
AttributeError: 'numpy.ndarray' object has no attribute 'index'
为什么将组作为numpy
数组而不是pandas.Series
传递?还有其他方法可以使用扩展/滚动功能来访问索引吗?
【问题讨论】:
我相信无论索引拆分是什么,扩展和滚动都会通过.values
切片
您可以通过定义一个函数和所传递参数的打印类型来测试这一点。
def f(x):
print(type(x),x)
return 0
srs.expanding(5).apply(f)
是的,只有 np.array 被传递,而不是带有索引的数据框。
您可以将raw=False
传递给apply
(这是一个参数,用于指示您是将数据作为numpy 数组还是作为Series 传递并且在groupby.apply
中也有效)。这将在您的示例中失败,因为您的 lambda 函数不返回数字,但我假设它仅用于说明目的。
【参考方案1】:
您可以使用扩展来访问索引,但前提是索引与值具有相同的类型。 例如它的工作原理:
s1 = pd.Series(index = range(10)).fillna(1)
s1.expanding(5).agg(lambda x: x.index[-1])
但它不起作用:
srs = pd.Series(index = pd.date_range('2013-01-01','2013-01-10' )).fillna(1)
srs.expanding(5).agg(lambda x: x.index[-1])
【讨论】:
以上是关于在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?的主要内容,如果未能解决你的问题,请参考以下文章