如果我有一个名为ts的pandas.core.series.Series,则为1或NaN,如下所示: 3382 NaN3381 NaN...3369 NaN3368 NaN...15 110 NaN11 112 113 19 NaN8 NaN7 NaN6 NaN3 NaN4 15 12 NaN1 NaN0 NaN 我想计算这个系列的cumsum但它应该在
3382 NaN 3381 NaN ... 3369 NaN 3368 NaN ... 15 1 10 NaN 11 1 12 1 13 1 9 NaN 8 NaN 7 NaN 6 NaN 3 NaN 4 1 5 1 2 NaN 1 NaN 0 NaN
我想计算这个系列的cumsum但它应该在NaN的位置重置(设置为零),如下所示:
3382 0 3381 0 ... 3369 0 3368 0 ... 15 1 10 0 11 1 12 2 13 3 9 0 8 0 7 0 6 0 3 0 4 1 5 2 2 0 1 0 0 0
理想情况下,我想有一个矢量化解决方案!
我曾经在Matlab看到过类似的问题:
Matlab cumsum reset at NaN?
但我不知道如何翻译这一行d = diff([0 c(n)]);
您的Matlab代码的简单Numpy翻译是这样的:import numpy as np v = np.array([1., 1., 1., np.nan, 1., 1., 1., 1., np.nan, 1.]) n = np.isnan(v) a = ~n c = np.cumsum(a) d = np.diff(np.concatenate(([0.], c[n]))) v[n] = -d np.cumsum(v)
执行此代码将返回结果数组([1.,2.,3.,0.,1.,2.,3.,4.,0.,1.]).此解决方案仅与原始解决方案一样有效,但如果它不足以满足您的需求,它可能会帮助您提供更好的解决方案.