Pandas DataFrame 用最新的前一个正值替换负值

iri*_*ris 4 python replace negative-number dataframe pandas

考虑一个DataFrame例如

df = pd.DataFrame({'a': [1,-2,0,3,-1,2], 
                   'b': [-1,-2,-5,-7,-1,-1], 
                   'c': [-1,-2,-5,4,5,3]})
Run Code Online (Sandbox Code Playgroud)

对于每一列,如何用最后一个正值或零替换任何负值?此处的最后是指从上到下的每列。注意到的最接近的解决方案是例如df[df < 0] = 0

预期的结果将是DataFrame这样的

df_res = pd.DataFrame({'a': [1,1,0,3,3,2], 
                       'b': [0,0,0,0,0,0], 
                       'c': [0,0,0,4,5,3]})
Run Code Online (Sandbox Code Playgroud)

Erf*_*fan 5

您可以使用DataFrame.mask将所有值转换< 0NaN然后使用ffilland fillna

df = df.mask(df.lt(0)).ffill().fillna(0).convert_dtypes()
Run Code Online (Sandbox Code Playgroud)
   a  b  c
0  1  0  0
1  1  0  0
2  0  0  0
3  3  0  4
4  3  0  5
5  2  0  3
Run Code Online (Sandbox Code Playgroud)