Использование:
m = df['X1'].shift().eq(df['X1'])
df['Y'] = np.where(m, df['X2'].shift().add(1), 0).astype(int)
print (df)
X1 X2 Y
0 1 1 0
1 1 2 2
2 1 3 3
3 2 2 0
4 2 2 3
5 1 2 0
Подробности :
Первое сравнение по Series.shift
ed valeus по Series.eq
для равенства:
m = df['X1'].shift().eq(df['X1'])
print (m)
0 False
1 True
2 True
3 False
4 True
5 False
Name: X1, dtype: bool
Затем сдвиньте столбец X2
, добавьте 1
:
print (df['X2'].shift().add(1))
0 NaN
1 2.0
2 3.0
3 4.0
4 3.0
5 3.0
Name: X2, dtype: float64
И установите новый столбец на numpy.where
:
print (np.where(m, df['X2'].shift().add(1), 0))
[0. 2. 3. 0. 3. 0.]
Другое решение от @Divakar:
df['Y'] = df.X1.shift().eq(df.X1)*(df.X2+1).shift().fillna(0).astype(int)
#pandas 0.24+
#df['Y'] = df.X1.shift().eq(df.X1)*(df.X2+1).shift(fill_value=0)
print (df)
X1 X2 Y
0 1 1 0
1 1 2 2
2 1 3 3
3 2 2 0
4 2 2 3
5 1 2 0