Итерация по 2 переменным для создания флага - PullRequest
0 голосов
/ 11 июня 2018

У меня есть df, который обычно выглядит так:

Year ID Loc
2014 56 01x
2015 56 01x
2016 56 07b
2014 23 04k
2016 23 75b
2017 56 75q
2015 23 04k
2016 12 23q
2014 12 23q
2015 12 23q

Я пытаюсь создать флаг для изменений Loc.Таким образом, для каждого идентификатора, если Loc совпадает с предыдущим годом, флаг = 0, иначе флаг = 1

Ожидаемый результат:

Year ID Loc Loc_change
2014 56 01x Null
2015 56 01x 0
2016 56 07b 1
2014 23 04k Null
2016 23 75b 1
2017 56 75q 1
2015 23 04k 0
2016 12 23q 0
2014 12 23q Null
2015 12 23q 0

Возможно ли это сделать, не выходя издолго в ширину?Если да, то как?

1 Ответ

0 голосов
/ 11 июня 2018

Вы можете использовать shift для сравнения.Сначала вам нужно отсортировать DataFrame, а затем shift позволит вам определить, совпадают ли ID и Loc с предыдущим годом, без необходимости groupby.

import pandas as pd
import numpy as np
df = df.sort_values(['ID', 'Year'])

df['Loc_change'] = (~((df.ID == df.ID.shift(1)) & (df.Loc == df.Loc.shift(1)))).astype('int')

# Fix and replace the earliest year with `NaN`
df.loc[df['ID'] != df['ID'].shift(1), 'Loc_change'] = np.NaN

df сейчас

   Year  ID  Loc  Loc_change
8  2014  12  23q         NaN
9  2015  12  23q         0.0
7  2016  12  23q         0.0
3  2014  23  04k         NaN
6  2015  23  04k         0.0
4  2016  23  75b         1.0
0  2014  56  01x         NaN
1  2015  56  01x         0.0
2  2016  56  07b         1.0
5  2017  56  75q         1.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...