Пометить изменение столбцов с 0 на значение построчно в Pandas DataFrame

В этом примере у меня есть набор данных с двумя столбцами 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()

Заранее спасибо за вашу помощь, если есть вопросы, не стесняйтесь оставлять комментарии.

Что делать, если два столбца изменились?

Erfan 13.04.2019 12:22

Если два изменения, то они также помечаются как 1 или любое значение, кроме 0. И включите их обоих как измененные (необязательно)

Soufiane Sabiri 13.04.2019 12:24

Кроме того, в производстве у меня около 10 столбцов как Prime & Prime2 ... пожалуйста, помогите! Спасибо!

Soufiane Sabiri 13.04.2019 12:25

Вы должны включить это в свой вопрос, так как это делает его довольно сложным.

Erfan 13.04.2019 12:25

Я добавил это.

Soufiane Sabiri 13.04.2019 12:27

Ваш вывод не имеет смысла, в каждой строке один из двух столбцов изменился по сравнению с предыдущей строкой, за исключением, очевидно, первой строки.

Erfan 13.04.2019 13:35

Что я должен делать?

Soufiane Sabiri 13.04.2019 13:43

Почему строки 3, 4 изменены на 0?

ResidentSleeper 13.04.2019 13:49

Потому что изменение, как в заголовке, от 0 до значения...

Soufiane Sabiri 13.04.2019 13:53

Пожалуйста, предоставьте любые советы или рекомендации, так как я смогу адаптировать ваше решение к тому, что действительно необходимо... Большое спасибо!

Soufiane Sabiri 13.04.2019 14:00

Я добавил стрелки в ожидаемый результат для ясности.

Soufiane Sabiri 13.04.2019 14:01

Я могу дать вам ответ, который делает столбец changed, но еще не названия столбцов.

Erfan 13.04.2019 14:09

Спасибо чувак! Это необязательно.

Soufiane Sabiri 13.04.2019 14:14

как бы вы тогда хотели сравнить третий столбец? с отставанием 2 для столбца prime3?

Venkatachalam 13.04.2019 14:16
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
14
484
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Мы можем использовать 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.

Erfan 13.04.2019 14:19

Есть только одна проблема, как я могу добавить это в группу id_police, потому что это правило применяется для каждого id_police...

Soufiane Sabiri 13.04.2019 14:20

Вы можете задать это в новом вопросе. На этот вопрос пока дан ответ. Вы всегда можете скопировать ссылку сюда в комментарии и отметить меня, я посмотрю.

Erfan 13.04.2019 14:21
помощь меня, спасибо!
Soufiane Sabiri 13.04.2019 14:26

Другие вопросы по теме