Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 遍历2个变量以创建标志_Python_Python 3.x_Pandas - Fatal编程技术网

Python 遍历2个变量以创建标志

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

我有一个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
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

你不想要第四栏吗?