【问题标题】:In pandas expanding/rolling function, how to use the index of the a dataframe or series?在 pandas 扩展/滚动功能中,如何使用数据框或系列的索引?
【发布时间】: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 函数不返回数字,但我假设它仅用于说明目的。

标签: python pandas datetime dataframe


【解决方案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])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2018-04-19
    • 2021-05-20
    • 2021-03-28
    • 1970-01-01
    • 2023-02-22
    • 2021-04-25
    相关资源
    最近更新 更多