我是熊猫的新手.我有一个像这样的Pandas数据框:
df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0]})
我想添加一个列val2,它指示一行是否落在另一行具有与其自身相同的id的行中,其中val1 == 1.
结果将是一个数据框,如:
df = pd.DataFrame(data={'id': [1, 1, 1, 2, 2, 2, 2], 'val1': [0, 1, 0, 0, 1, 0, 0], 'val2': [0, 0, 1, 0, 0, 1, 1]})
我的第一个想法是使用apply语句,但这些只是按行进行.从我的循环经验来看,永远不是答案.任何帮助将不胜感激!
最佳答案 让我们尝试在groupby中移动cumsum.
df['val2'] = df.groupby('id').val1.apply(
lambda x: x.shift().cumsum()
).ge(1).astype(int)
或者,为了避免lambda,
df['val2'] = (
df.groupby('id')
.val1.shift()
.groupby(df.id)
.cumsum()
.ge(1)
.astype(int)
)
df
id val1 val2
0 1 0 0
1 1 1 0
2 1 0 1
3 2 0 0
4 2 1 0
5 2 0 1
6 2 0 1