PandasDataFrame用最新的前一个正值替换负值
考虑一个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]})
对于每一列,如何用最后一个正值或零替换任何负值?此处的最后是指从上到下的每列。注意到的最接近的解决方案是例如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]})
回答
您可以使用DataFrame.mask将所有值转换< 0为NaN然后使用ffilland fillna:
df = df.mask(df.lt(0)).ffill().fillna(0).convert_dtypes()
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