Cumsum reset at NaN

后端 未结 4 1404
醉话见心
醉话见心 2020-11-27 05:21

If I have a pandas.core.series.Series named ts of either 1\'s or NaN\'s like this:

3382   NaN
3381   NaN
...
3369   NaN
3368   NaN
         


        
4条回答
  •  天命终不由人
    2020-11-27 06:19

    Here's a slightly more pandas-onic way to do it:

    v = Series([1, 1, 1, nan, 1, 1, 1, 1, nan, 1], dtype=float)
    n = v.isnull()
    a = ~n
    c = a.cumsum()
    index = c[n].index  # need the index for reconstruction after the np.diff
    d = Series(np.diff(np.hstack(([0.], c[n]))), index=index)
    v[n] = -d
    result = v.cumsum()
    

    Note that either of these requires that you're using pandas at least at 9da899b or newer. If you aren't then you can cast the bool dtype to an int64 or float64 dtype:

    v = Series([1, 1, 1, nan, 1, 1, 1, 1, nan, 1], dtype=float)
    n = v.isnull()
    a = ~n
    c = a.astype(float).cumsum()
    index = c[n].index  # need the index for reconstruction after the np.diff
    d = Series(np.diff(np.hstack(([0.], c[n]))), index=index)
    v[n] = -d
    result = v.cumsum()
    

提交回复
热议问题