我需要更新vid或可能基于change列创建一个新列

df = [{'vid': 14, 'change': 0}, {'vid': 15, 'change': 1}, {'vid': 16, 'change': 0}, {'vid': 16, 'change': 0}, {'vid': 17, 'change': 0}, {'vid': 17, 'change': 1}, {'vid': 18, 'change': 0}, {'vid': 18, 'change': 0}]

    vid  change
0    14       0
1    15       1
2    16       0
3    16       0
4    17       0
5    17       1
6    18       0
7    18       0


如果change == 1,则下一个vid集应更改为当前,而如果change == 0,则下一个vid应保持不变。

从我上面的示例中,vid 15需要更改为15,因为15更改= 1,但是17停留了,因为16没有更改= 1

仅当vid将在下一行更改时,才会发生Change = 1

预期产量

    vid  change
0    14       0
1    15       1
2    15       0
3    15       0
4    17       0
5    17       1
6    17       0
7    17       0

最佳答案

如果您不介意将所有替换的数字重新编号为连续的,则可以通过减去更改的shift ed cumsum来获得非常干净的版本:

In [59]: df['new_vid'] = df['vid'] - df['change'].shift(fill_value=0).cumsum()

In [60]: df
Out[60]:
   vid  change  new_vid
0   14       0       14
1   15       1       15
2   16       0       15
3   16       0       15
4   17       0       16
5   17       1       16
6   18       0       16
7   18       0       16


带有原始编号的另一个选项是使用mapgroupby

In [81]: df['vid'] = df['vid'] - df['vid'].map(df.groupby("vid")['change'].max().shift(fill_value=0))

In [82]: df
Out[82]:
   vid  change
0   14       0
1   15       1
2   15       0
3   15       0
4   17       0
5   17       1
6   17       0
7   17       0

关于python - 根据其他列条件更新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58841747/

10-09 07:53