我有一个旅行数据,其中有开始日期、结束日期、开始位置和结束位置。我需要为这个数据集生成一个密钥。
首先,根据开始日期对数据进行排序,然后对于每个开始和结束日期对,如果前一行的结束位置和当前行的开始位置相同,则分配相同的 ID,否则分配新的 ID。如果日期不同,默认分配新 ID。
这是我需要的输出。 [对于输入只需删除Key列]
Start End Start Location End Location Key
06-11-2020 17-11-2020 A B 1
17-11-2020 17-11-2020 B C 2
17-11-2020 17-11-2020 C D 2
19-11-2020 19-11-2020 E F 3
19-11-2020 19-11-2020 G A 4
19-11-2020 19-11-2020 A H 4
19-11-2020 19-11-2020 H G 4
19-11-2020 19-11-2020 G A 4
20-11-2020 20-11-2020 E H 5
20-11-2020 20-11-2020 H I 5
20-11-2020 20-11-2020 J A 6
21-11-2020 21-11-2020 E G 7
21-11-2020 21-11-2020 K A 8
21-11-2020 21-11-2020 E A 9
21-11-2020 21-11-2020 E G 10
21-11-2020 21-11-2020 G A 10
您需要另一个键来根据您的要求与
Start
和End Start
列进行分组(检查当前的Location
是否与之前的End Location
相同)。之后用ngroup
获取群号:
df['Key'] = (df.sort_values('Start')
.assign(Loc=df['Location'].ne(df['End Location'].shift()).cumsum())
.groupby(['Start', 'End Start', 'Loc'])
.ngroup().add(1).drop(columns='Loc'))
输出:
>>> df
Start End Start Location End Location Key
0 06-11-2020 17-11-2020 A B 1
1 17-11-2020 17-11-2020 B C 2
2 17-11-2020 17-11-2020 C D 2
3 19-11-2020 19-11-2020 E F 3
4 19-11-2020 19-11-2020 G A 4
5 19-11-2020 19-11-2020 A H 4
6 19-11-2020 19-11-2020 H G 4
7 19-11-2020 19-11-2020 G A 4
8 20-11-2020 20-11-2020 E H 5
9 20-11-2020 20-11-2020 H I 5
10 20-11-2020 20-11-2020 J A 6
11 21-11-2020 21-11-2020 E G 7
12 21-11-2020 21-11-2020 K A 8
13 21-11-2020 21-11-2020 E A 9
14 21-11-2020 21-11-2020 E G 10
15 21-11-2020 21-11-2020 G A 10
关于
Loc
的详细信息:
# Loc = df['Location'].ne(df['End Location'].shift()).cumsum().rename('Loc')
>>> pd.concat([df[['Location', 'End Location']], Loc], axis=1)
Location End Location Loc
0 A B 1
1 B C 1
2 C D 1
3 E F 2
4 G A 3
5 A H 3
6 H G 3
7 G A 3
8 E H 4
9 H I 4
10 J A 5
11 E G 6
12 K A 7
13 E A 8
14 E G 9
15 G A 9