Pandas 删除所有 0,直到多索引的每个级别中的第一个非零值

Nat*_*ate 3 python multi-index pandas pandas-groupby

我正在处理 pandas MultiIndex 数据集,其中许多不同的数据组(项目 1、项目 2 等)都有 0。我只想删除包含 0 的行,其中 0 位于项目组的开头。如果非零数字后面有 0,我不想删除它。如何删除所有零,直到每组内的第一个非零值(索引外)?

原始数据

                          Quantity
Item1           2016-05-08  0.0
                2016-05-15  0.0
                2016-05-22  0.0
                2016-05-29  456
                2016-06-05   22
Item2           2018-03-08  0.0
                2018-03-15  300
                2018-03-21  0.0
                2018-03-29  0.0
                2018-03-05  433
Run Code Online (Sandbox Code Playgroud)

所需输出

                          Quantity
Item1           2016-05-29  456
                2016-06-05   22
Item2           2018-03-15  300
                2018-03-21  0.0
                2018-03-29  0.0
                2018-03-05  433
Run Code Online (Sandbox Code Playgroud)

Cod*_*ent 5

本质上是一个岛屿和缺口问题。每当您在组中达到非零值时,就会创建一个新岛屿。那么你的工作就变成了移除那些岛屿 0。代码:

islands = (df['Quantity'] != 0).groupby(level=0).cumsum()
df[islands != 0]
Run Code Online (Sandbox Code Playgroud)

慢镜头记录一下发生的事情:

                    Quantity   Quantity != 0?   cumsum
Item1   2016-05-08       0.0           False         0
        2016-05-15       0.0           False         0
        2016-05-22       0.0           False         0
        2016-05-29       456            True         1
        2016-06-05        22            True         2
------------------------------------------------------
Item2   2018-03-08       0.0           False         0
        2018-03-15       300            True         1
        2018-03-21       0.0           False         1
        2018-03-29       0.0           False         1
        2018-03-05       433            True         2
Run Code Online (Sandbox Code Playgroud)

最后,您删除行cumsum == 0