OK, now I have corrected my approach to working with inputs, as was originally requested.
Start with a sample dataset:
dataset = {{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 0}, {g, 4}, {h,5}, {i, 6}, {j, 7}, {k, 4}, {l, 7}, {m, 8}, {n, 9}, {o, 0}, {p,2}, {q, 3}};
Take the transpose:
trDataset = Transpose[dataset];
The following function only works with Y values:
trDataset[[2]] = FoldList[Plus, dataset[[1, 2]], Map[Max[#, 0] &, Differences[dataset[[All, 2]]]]]
Cancel transpose:
dataset = Transpose[trDataset]
and exit now
{{a, 1}, {b, 2}, {c, 3}, {d, 4}, {e, 5}, {f, 5}, {g, 9}, {h, 10}, {i, 11}, {j, 12}, {k, 12}, {l, 15}, {m, 16}, {n, 17}, {o, 17}, {p, 19}, {q, 20}}
I still have not tested the performance of this solution.
EDIT: Okay, here is the basics of the fix, I'll leave all the work to you @dreeves. This version of monotonify only works on a list of numbers, I did not include it in my previous sentence to work with your inputs.
monotonify[series_] := Split[series, Less]
EDIT 2: Another function that works with a list of numbers. This is much faster than my previous attempt.
monotonify[series_] := Accumulate[Flatten[Map[Flatten[{