Сравнение с предыдущей строкой и суммирование - PullRequest
1 голос
/ 26 мая 2019

В фрейме данных есть таблица:

X1  X2
1   1
1   2
1   3
2   2
2   2
1   2

Для каждой строки необходимо вычислить значение Y, где Y = X2 (предыдущая строка) +1, если X1 = X1 (предыдущая строка), также0. Результат:

X1  X2  Y
1   1   0
1   2   2
1   3   3
2   2   0
2   2   3
1   2   0

Ответы [ 3 ]

4 голосов
/ 26 мая 2019

вы можете использовать:

c1=df.X1.ne(df.X1.shift()) #checks for changes in X1 column

Затем мы видим, где нет изменений в X1, берем предыдущую строку и добавляем 1, иначе 0. Используя np.where()

df['Y']=np.where(~c1,df.X2.shift()+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
3 голосов
/ 26 мая 2019

Использование:

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
1 голос
/ 26 мая 2019

Я использую groupby для групп без изменений X1.В каждой группе выполните shift на X2, чтобы добавить 1 к ней.Наконец, fillna на измененных значениях X1

df['Y'] = df.groupby(df.X1.ne(df.X1.shift()).cumsum()).X2.shift().add(1).fillna(0)


Out[569]:
   X1  X2    Y
0   1   1  0.0
1   1   2  2.0
2   1   3  3.0
3   2   2  0.0
4   2   2  3.0
5   1   2  0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...