事实证明这是无法完成的。
继续相同的示例:
def burndowntheworld(ser):
print('Are you sure?')
return ser/0
df.select_dtypes(['object']).expanding().apply(burndowntheworld)
Out:
C2 C3 C4
0 {A} A [A]
1 {B} B [B]
2 {C} C [C]
3 {D} D [D]
如果列的类型是对象,则永远不会调用该函数。熊猫没有其他适用于对象的替代品。相同rolling().apply()
。
从某种意义上说,这是一件好事,因为expanding.apply
使用自定义函数具有O(n ** 2)复杂度。对于诸如等的特殊情况cumsum
,ewma
操作的递归性质可以将线性时间的复杂度降低,但是在最一般的情况下,它应该为前n个元素,然后为前n + 1个元素计算函数,依此类推。因此,特别是对于仅依赖于当前值和函数先前值的函数,扩展效率很低。更不用说将列表或集合存储在DataFrame中从来不是一个好主意。
因此答案是:如果您的数据不是数字,并且函数取决于先前的结果和当前元素,则只需使用for循环即可。无论如何,它将更有效率。