代码之家  ›  专栏  ›  技术社区  ›  Mohamed Thasin ah

如何将ffill应用到1?

  •  1
  • Mohamed Thasin ah  · 技术社区  · 6 年前

    我有一个如下的数据框,

       A  B  C  D
    0  1  0  0  0
    1  0  1  0  0
    2  0  1  0  0
    3  0  0  1  0
    

    我想把它变成这样,

       A  B  C  D
    0  1  0  0  0
    1  1  1  0  0
    2  1  1  0  0
    3  1  1  1  0
    

    到目前为止我试过,

    df= df.replace('0',np.NaN)
    df=df.fillna(method='ffill').fillna('0')
    

    我上面的代码运行良好,

    但我认为还有其他更好的方法来解决这个问题,

    1 回复  |  直到 6 年前
        1
  •  2
  •   jezrael    6 年前

    使用 cumsum 将数据转换为数字,然后替换为 DataFrame.mask :

    df = df.mask(df.astype(int).cumsum() >= 1, '1')
    print (df)
       A  B  C  D
    0  1  0  0  0
    1  1  1  0  0
    2  1  1  0  0
    3  1  1  1  0
    

    细节 :

    print (df.astype(int).cumsum())
       A  B  C  D
    0  1  0  0  0
    1  1  1  0  0
    2  1  2  0  0
    3  1  2  1  0
    

    或同一个普林西比 numpy 具有 numpy.where :

    arr = df.values.astype(int)
    
    df = pd.DataFrame(np.where(np.cumsum(arr, axis=0) >= 1, '1', '0'), 
                      index=df.index, 
                      columns= df.columns)
    print (df)
       A  B  C  D
    0  1  0  0  0
    1  1  1  0  0
    2  1  1  0  0
    3  1  1  1  0