В этом примере у меня есть набор данных с двумя столбцами prime и prime2, которые я хочу проверить на наличие изменений в стиле строки за строкой:
>>> df = pd.DataFrame({'id_police':['p123','p123','p123','b123','b123'],
'date':['24/01/2017','24/11/2017','25/02/2018','24/02/2018','24/03/2018'],
'prime':[0,0,10,20,30],
'prime2':[0,30,10,20,0],
})
###
id_police date prime prime2
0 p123 24/01/2017 0 0
1 p123 24/11/2017 0 30
2 p123 25/02/2018 10 10
3 b123 24/02/2018 20 20
4 b123 24/03/2018 30 0
Это ожидаемый результат (если два столбца изменяются, флаг не равен 0, и добавьте их в измененное место, а также есть 10 столбцов, таких как Prime и Prime2):
id_police date prime prime2 changed changedwhere(optional)
0 p123 24/01/2017 0 0<- 0 nan
1 p123 24/11/2017 0<- 30<- 1 prime2
2 p123 25/02/2018 10<- 10 1 prime
3 b123 24/02/2018 20 20 0 nan
4 b123 24/03/2018 30 0 0 nan
Что я пробовал, но это выглядит во всех столбцах:
df.diff()
Заранее спасибо за вашу помощь, если есть вопросы, не стесняйтесь оставлять комментарии.
Если два изменения, то они также помечаются как 1 или любое значение, кроме 0. И включите их обоих как измененные (необязательно)
Кроме того, в производстве у меня около 10 столбцов как Prime & Prime2 ... пожалуйста, помогите! Спасибо!
Вы должны включить это в свой вопрос, так как это делает его довольно сложным.
Я добавил это.
Ваш вывод не имеет смысла, в каждой строке один из двух столбцов изменился по сравнению с предыдущей строкой, за исключением, очевидно, первой строки.
Что я должен делать?
Почему строки 3, 4 изменены на 0?
Потому что изменение, как в заголовке, от 0 до значения...
Пожалуйста, предоставьте любые советы или рекомендации, так как я смогу адаптировать ваше решение к тому, что действительно необходимо... Большое спасибо!
Я добавил стрелки в ожидаемый результат для ясности.
Я могу дать вам ответ, который делает столбец changed, но еще не названия столбцов.
Спасибо чувак! Это необязательно.
как бы вы тогда хотели сравнить третий столбец? с отставанием 2 для столбца prime3?






Мы можем использовать Series.eq поверх axis=1 и объединить его с .shift, чтобы проверить предыдущую строку, как показано ниже:
df['changed'] = (df[['prime', 'prime2']].shift().eq(0).any(axis=1) & df[['prime', 'prime2']].ne(0).any(axis=1)).astype(int)
print(df)
id_police date prime prime2 changed
0 p123 24/01/2017 0 0 0
1 p123 24/11/2017 0 30 1
2 p123 25/02/2018 10 10 1
3 b123 24/02/2018 20 20 0
4 b123 24/03/2018 30 0 0
Примечание, если у вас 10 столбцов, это будет сложнее, но для вашего примера этого достаточно
Панды :) @SabiriS.
Есть только одна проблема, как я могу добавить это в группу id_police, потому что это правило применяется для каждого id_police...
Вы можете задать это в новом вопросе. На этот вопрос пока дан ответ. Вы всегда можете скопировать ссылку сюда в комментарии и отметить меня, я посмотрю.
Что делать, если два столбца изменились?