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

2024-07-08 17:57:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

              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

有人能在这方面提供帮助吗?或者有其他的解决办法吗?提前谢谢


Tags: 数据indfforcolumnmask数字year
1条回答
网友
1楼 · 发布于 2024-07-08 17:57:19

我认为需要比较两个连续的0,用^{}^{}替换另一个值到0,用^{}NaNs转换成0,最后转换成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)

相关问题 更多 >

    热门问题