如何根据条件链接行程并分配唯一键?

问题描述 投票:0回答:1

我有一个旅行数据,其中有开始日期、结束日期、开始位置和结束位置。我需要为这个数据集生成一个密钥。

首先,根据开始日期对数据进行排序,然后对于每个开始和结束日期对,如果前一行的结束位置和当前行的开始位置相同,则分配相同的 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 
python pandas qliksense
1个回答
0
投票

您需要另一个键来根据您的要求与

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
© www.soinside.com 2019 - 2024. All rights reserved.