我想从值相对于前一列中的值减少的列开始,用零填充数据帧的每一行
我有以下数据帧:
ActualDf = pd.DataFrame(np.array([[2, 3, 2, 3, 4, 5, 0, 0, 0, 0, 0], [1, 1, 1, 2, 2, 3, 1, 1, 0, 0, 0], [2, 2, 2, 3, 3, 5, 3, 3, 0, 0, 0], [2, 3, 2, 3, 3, 3, 4, 1, 2, 0, 0], [3, 3, 1, 2, 2, 5, 0, 0, 0, 0, 0], [1, 2, 3, 1, 2, 3, 0, 0, 0, 0, 0]]),
columns=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10']
)
我想获得这个
DesiredDf = pd.DataFrame(np.array([[2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 2, 2, 3, 0, 0, 0, 0, 0], [2, 2, 2, 3, 3, 5, 0, 0, 0, 0, 0], [2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], [3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0]]),
columns=['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'])
怎么可能以有效的方式做到这一点?
这里有一个类似于使用mask
:的方法
DesiredDf =ActualDf.mask(ActualDf.diff(axis=1).lt(0).cummax(axis=1), 0)
输出:
0 1 2 3 4 5 6 7 8 9 10
0 2 3 0 0 0 0 0 0 0 0 0
1 1 1 1 2 2 3 0 0 0 0 0
2 2 2 2 3 3 5 0 0 0 0 0
3 2 3 0 0 0 0 0 0 0 0 0
4 3 3 0 0 0 0 0 0 0 0 0
5 1 2 3 0 0 0 0 0 0 0 0
您可以使用diff
和lt
来查找差值为负值的位置,然后使用cumsum
和gt
来标记第一个负值之后的所有单元格。
ActualDf[ActualDf.diff(axis=1).lt(0).cumsum(1).gt(0)] = 0