我有一个看起来像这样的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到宽的情况下执行此操作?如果是这样,怎么样?
答案 0 :(得分:1)
您可以使用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