Python 遍历2个变量以创建标志
我有一个df,大致如下所示:Python 遍历2个变量以创建标志,python,python-3.x,pandas,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与上一年相同,则标志=0,否则标志=1 预期产出: Year ID Loc Loc_change 2014 56 01x Null 201
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与上一年相同,则标志=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
是否可以在不从长df到宽df的情况下执行此操作?如果是,如何进行比较?您可以使用
shift
进行比较。首先,您需要对数据帧进行排序
,然后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
你不想要第四栏吗?