我有一个 Pandas 系列,其中每个单元都是一个元组。我正在尝试对该系列进行rolling()。apply(),而我尝试应用的函数从未被调用。这是一个愚蠢的例子,显示了我在说什么:

>>> import pandas as pd
>>> pd.__version__
u'0.18.0'
>>> die = lambda x: 0/0

>>> s = pd.Series(zip(range(5), range(5)))
>>> s
0    (0, 0)
1    (1, 1)
2    (2, 2)
3    (3, 3)
4    (4, 4)
dtype: object

一个简单的apply可以正常工作,因为该函数称为:
>>> s.apply(die)
[...]
ZeroDivisionError: integer division or modulo by zero

但是rolling().apply()根本不执行任何操作,尤其是应该被调用的函数永远不会被调用:
>>> s.rolling(2).apply(die)
0    (0, 0)
1    (1, 1)
2    (2, 2)
3    (3, 3)
4    (4, 4)
dtype: object

这是最简单的示例,它演示了我在说什么,但是对集合和列表也会发生相同的情况。

为什么会发生这种情况,我如何在一系列集合中使用自定义函数进行滚动应用?

最佳答案

这将不起作用,因为pandas.DataFrame.rolling函数沿DataFrame的输入轴返回针对特定操作的Window或Rolling子类,而pandas.DataFrame.apply应用此函数。正如ayhan在this帖子中提到的那样。

10-01 10:48