我有一个如下数据框,
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')
我上面的代码工作正常,
但是我认为还有其他更好的方法可以解决此问题,
答案 0 :(得分:2)
将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