代码之家  ›  专栏  ›  技术社区  ›  LostinSpatialAnalysis

如何在python中将第二次和后续出现的0设置为NaN

  •  0
  • LostinSpatialAnalysis  · 技术社区  · 1 年前

    我试图弄清楚如何在python中将数据帧中所有第二次出现的0设置为NaN。但是,这是一个转换的数据帧,因此0将出现在列之间。为了解释,我有以下数据框:

         A   B   C   D   E   F   G
    -------------------------------
    0   55  34  30  29  15    0  0
    1   63  59  49  32  21   16  0   
    2   42  24  12   5   0    0  0
    3   25  6    0   0   0    0  0
    4   13  0    0   0   0    0  0
    

    因此,我不想计算列中0的出现次数,而是要计算每一行中0的出现次数(如果我没有正确地使用此词,并且如果我不应该将其称为“转置”,则表示歉意)。

    因此,对于这个数据帧中的每一行,从列“A”开始,按顺序转到列“G”,我希望看到在第一次出现NaN之后出现的每一个0。因此,我想生成以下输出数据帧:

         A     B     C      D     E     F     G
    --------------------------------------------
    0   55    34     30    29    15     0   NaN
    1   63    59     49    32    21    16     0   
    2   42    24     12     5     0   NaN   NaN
    3   25     6      0   NaN   NaN   NaN   NaN
    4   13     0    NaN   NaN   NaN   NaN   NaN
    

    如何将每行第一次出现0后的所有0设置为NaN?我知道简单地将所有0都设置为NaN更简单,但我想不出一种简单的方法来告诉python我想将第一个设置为NaN之后出现的所有0分开。

    为了解释为什么要这样做,我尝试在数据框中绘制每一行的字母(作为x轴)。因此,将所有这些0放在一行中会导致绘图中出现不必要的点,因为我只对曲线到达0的点感兴趣。0的轨迹将生成与仅包含0的单个实例不同的形状曲线。所以我只想绘制每一行,直到到达0的初始点(衰减曲线)。

    1 回复  |  直到 1 年前
        1
  •  2
  •   Rodalm    1 年前

    使用计算行上零的累积计数 df.eq(0).cumsum(axis=1) 然后使用大于1的零计数填充值 DataFrame.mask

    res = df.mask(df.eq(0).cumsum(axis=1).gt(1))
    

    输出:

    >>> res
    
        A   B     C     D     E     F    G
    0  55  34  30.0  29.0  15.0   0.0  NaN
    1  63  59  49.0  32.0  21.0  16.0  0.0
    2  42  24  12.0   5.0   0.0   NaN  NaN
    3  25   6   0.0   NaN   NaN   NaN  NaN
    4  13   0   NaN   NaN   NaN   NaN  NaN
    

    中间输出:

    >>> df.eq(0).cumsum(axis=1) 
    
       A  B  C  D  E  F  G
    0  0  0  0  0  0  1  2
    1  0  0  0  0  0  0  1
    2  0  0  0  0  1  2  3
    3  0  0  1  2  3  4  5
    4  0  1  2  3  4  5  6
    
    >>> df.eq(0).cumsum(axis=1).gt(1)
    
           A      B      C      D      E      F      G
    0  False  False  False  False  False  False   True
    1  False  False  False  False  False  False  False
    2  False  False  False  False  False   True   True
    3  False  False  False   True   True   True   True
    4  False  False   True   True   True   True   True