比较数据帧中的2个连续单元格

时间:2018-03-19 08:07:25

标签: python pandas dataframe

我有一个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

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

1 个答案:

答案 0 :(得分:1)

我认为需要比较连续2次0,将whereshift替换为0,将NaN转换为0fillna,最后到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)