在 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 扩展/滚动功能中,如何使用数据框或系列的索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pandas 中执行滚动求和和乘法? [关闭]

在循环中向 pandas 数据帧添加滚动平均值需要很长时间

如何使用 Plotly 在 Python 中使用 Pandas 数据框列设置散点图悬停信息

如何在特定小时的滚动平均值的熊猫数据框中添加一列

使用 Groupby 的 Pandas 滚动函数

在 pandas 中使用半小时增量计算 8 小时大小的滚动窗口