迭代2个变量来创建一个标志

时间:2018-06-11 18:46:46

标签: python python-3.x pandas

我有一个看起来像这样的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更改创建一个标志。因此,对于每个ID,如果Loc与前一年相同,则flag = 0,否则flag = 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

是否可以在不从长df到宽的情况下执行此操作?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

您可以使用shift进行比较。首先,您需要对DataFrame进行排序,然后shift将允许您确定IDLoc是否与上一年相同,而无需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