我有一个带有multiindex的数据框(超过150行和16列),如下所示:

              a001          a002          a003        a004         a005
Year Week
2017  1          0            1            1            3            0
      2          1            2            2            4            0
      3          2            0            3            5            0
      4          0            0            4            0            0
      5          0            1            5            0            0
      6          0            2            6            1            0
      7          0            0            7            2            0
      8          1            0            0            3            0
      9          2            0            0            0            0
     10          3            2            0            0            0


我想要的是每行只有最后一个数字在下一行的0之前:

              a001          a002          a003        a004         a005
Year Week
2017  1          0            0            0            0            0
      2          0            0            0            0            0
      3          0            2            0            0            0
      4          2            0            0            5            0
      5          0            0            0            0            0
      6          0            0            0            0            0
      7          0            2            0            0            0
      8          0            0            7            0            0
      9          0            0            0            3            0
     10          0            0            0            0            0


我开始尝试使用mask,但后来陷入困境

for i in column:
    mask = (df[i] < df[i].shift())
    print mask


任何人都可以朝这个方向或其他解决方案提供帮助吗?提前致谢

最佳答案

我认为需要比较两个连续的0,用0where将另一个值替换为shift,通过NaN0 s转换为fillna,最后转换为integer

mask = (df != 0) & (df.shift(-1) == 0) & (df.shift(-2) == 0)
df1 = df.where(mask).shift().fillna(0).astype(int)

print (df1)
           a001  a002  a003  a004  a005
Year Week
2017 1        0     0     0     0     0
     2        0     0     0     0     0
     3        0     2     0     0     0
     4        2     0     0     5     0
     5        0     0     0     0     0
     6        0     0     0     0     0
     7        0     2     0     0     0
     8        0     0     7     0     0
     9        0     0     0     3     0
     10       0     0     0     0     0


编辑:

感谢@Joe简化代码:

df1 = df.where((df != 0) & (df.shift(-1) == 0)).shift().fillna(0).astype(int)

关于python - 比较数据框中的2个连续单元,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49358261/

10-12 03:51