事实证明这是无法完成的。
继续相同的示例:
def burndowntheworld(ser): print('Are you sure?') return ser/0df.select_dtypes(['object']).expanding().apply(burndowntheworld)Out: C2 C3 C40 {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循环即可。无论如何,它将更有效率。



