Python 3.x 创建具有周期性重复值的匹配标签

Python 3.x 创建具有周期性重复值的匹配标签,python-3.x,pandas,for-loop,lambda,apply,Python 3.x,Pandas,For Loop,Lambda,Apply,我有下面的输入数据示例。我有下面的代码,它通过将清除的列值与之前记录中的值进行比较来创建标签列,然后如果值匹配,则为其指定相同的字母,或者指定一个新的值。我的问题是,我希望为标签列选择的字母以每个新标签集id重新开始。因此,第一个标签集id=2的标签值为A。每20个记录标签集id增加1。有人能建议我如何修改下面的代码来实现这一点吗?或者有没有一种更巧妙的方法来处理熊猫,比如使用apply函数。这段代码确实运行得有点慢 代码: 输入数据: print(data_df2[:30]) id

我有下面的输入数据示例。我有下面的代码,它通过将清除的列值与之前记录中的值进行比较来创建标签列,然后如果值匹配,则为其指定相同的字母,或者指定一个新的值。我的问题是,我希望为标签列选择的字母以每个新标签集id重新开始。因此,第一个标签集id=2的标签值为A。每20个记录标签集id增加1。有人能建议我如何修改下面的代码来实现这一点吗?或者有没有一种更巧妙的方法来处理熊猫,比如使用apply函数。这段代码确实运行得有点慢

代码:

输入数据:

print(data_df2[:30])

    id                                    Source  \
0    1                                ,O-PEN 2.0   
1    2  .7 FRAM BLOWER - BROTHERLY LOVE MECHANIC   
2    3                           @BEEZLEEXTRACTS   
3    4                              @CALISIFTCO_   
4    5                @CALISIFTCO_ X @_ZKITTLEZ_   
5    6               @CALISIFTCO_ X @WONDERBRETT   
6    7              @CALISIFTCO_ X @WONDERBRETT_   
7    8                             @DNA_GENETICS   
8    9                          @EDENEXTRACTS_CA   
9   10           @EDENEXTRACTS_CA X @CALISIFTCO_   
10  11                         @FULLFLAVAEXTRACT   
11  12                                @GGSTRAINS   
12  13                            @SHERBINSKI415   
13  14          @STR8MECHANIC X @ICEDOUTEXTRACTS   
14  15              @STR8MECHANIC X @REZHEADS215   
15  16                             [SS] 710 LABS   
16  17                    [SS] ABSOLUTE EXTRACTS   
17  18                           [SS] BIG PETE'S   
18  19                          [SS] BLOOM FARMS   
19  20                           [SS] BLUE RIVER   
20  21                           [SS] BRITE LABS   
21  22                       [SS] BROTHERLY LOVE   
22  23              [SS] BROTHERLY LOVE [3 PACK]   
23  24                   [SS] CALIFORNIA DREAMIN   
24  25                             [SS] DIME BAG   
25  26                       [SS] EDEN INFUSIONS   
26  27                            [SS] EEL RIVER   
27  28                           [SS] GANJA GOLD   
28  29                       [SS] GLOWING BUDDHA   
29  30                                [SS] JETTY   

                         Cleaned  label_set_id label  
0                     O.PEN VAPE             1     A  
1                 BROTHERLY LOVE             1     B  
2                BEEZLE EXTRACTS             1     C  
3                   CALI SIFT CO             1     D  
4                   CALI SIFT CO             1     D  
5   @CALISIFTCO_ X @WONDERBRETT_             1     E  
6   @CALISIFTCO_ X @WONDERBRETT_             1     E  
7                   DNA GENETICS             1     F  
8                           EDEN             1     G  
9                   CALI SIFT CO             1     H  
10                       FLAV RX             1     I  
11                    GG STRAINS             1     J  
12                    SHERBINSKI             1     K  
13                 STR8 MECHANIC             1     L  
14                 STR8 MECHANIC             1     L  
15                      710 LABS             1     M  
16              ABSOLUTE XTRACTS             1     N  
17             BIG PETE'S TREATS             1     O  
18                   BLOOM FARMS             1     P  
19                    BLUE RIVER             1     Q  
20                    BRITE LABS             2     R  
21                BROTHERLY LOVE             2     S  
22                BROTHERLY LOVE             2     S  
23            CALIFORNIA DREAMIN             2     T  
24                      DIME BAG             2     U  
25                          EDEN             2     V  
26                     EEL RIVER             2     W  
27                    GANJA GOLD             2     X  
28                GLOWING BUDDHA             2     Y  
29                JETTY EXTRACTS             2     Z 
输出数据:

    id                                    Source  \
0    1                                ,O-PEN 2.0   
1    2  .7 FRAM BLOWER - BROTHERLY LOVE MECHANIC   
2    3                           @BEEZLEEXTRACTS   
3    4                              @CALISIFTCO_   
4    5                @CALISIFTCO_ X @_ZKITTLEZ_   
5    6               @CALISIFTCO_ X @WONDERBRETT   
6    7              @CALISIFTCO_ X @WONDERBRETT_   
7    8                             @DNA_GENETICS   
8    9                          @EDENEXTRACTS_CA   
9   10           @EDENEXTRACTS_CA X @CALISIFTCO_   
10  11                         @FULLFLAVAEXTRACT   
11  12                                @GGSTRAINS   
12  13                            @SHERBINSKI415   
13  14          @STR8MECHANIC X @ICEDOUTEXTRACTS   
14  15              @STR8MECHANIC X @REZHEADS215   
15  16                             [SS] 710 LABS   
16  17                    [SS] ABSOLUTE EXTRACTS   
17  18                           [SS] BIG PETE'S   
18  19                          [SS] BLOOM FARMS   
19  20                           [SS] BLUE RIVER   
20  21                           [SS] BRITE LABS   
21  22                       [SS] BROTHERLY LOVE   
22  23              [SS] BROTHERLY LOVE [3 PACK]   
23  24                   [SS] CALIFORNIA DREAMIN   
24  25                             [SS] DIME BAG   
25  26                       [SS] EDEN INFUSIONS   
26  27                            [SS] EEL RIVER   
27  28                           [SS] GANJA GOLD   
28  29                       [SS] GLOWING BUDDHA   
29  30                                [SS] JETTY   

                         Cleaned  label_set_id label  
0                     O.PEN VAPE             1     A  
1                 BROTHERLY LOVE             1     B  
2                BEEZLE EXTRACTS             1     C  
3                   CALI SIFT CO             1     D  
4                   CALI SIFT CO             1     D  
5   @CALISIFTCO_ X @WONDERBRETT_             1     E  
6   @CALISIFTCO_ X @WONDERBRETT_             1     E  
7                   DNA GENETICS             1     F  
8                           EDEN             1     G  
9                   CALI SIFT CO             1     H  
10                       FLAV RX             1     I  
11                    GG STRAINS             1     J  
12                    SHERBINSKI             1     K  
13                 STR8 MECHANIC             1     L  
14                 STR8 MECHANIC             1     L  
15                      710 LABS             1     M  
16              ABSOLUTE XTRACTS             1     N  
17             BIG PETE'S TREATS             1     O  
18                   BLOOM FARMS             1     P  
19                    BLUE RIVER             1     Q  
20                    BRITE LABS             2     A  
21                BROTHERLY LOVE             2     B  
22                BROTHERLY LOVE             2     B  
23            CALIFORNIA DREAMIN             2     C  
24                      DIME BAG             2     D  
25                          EDEN             2     E  
26                     EEL RIVER             2     F  
27                    GANJA GOLD             2     G  
28                GLOWING BUDDHA             2     H  
29                JETTY EXTRACTS             2     I  

IIUC,您可以使用标签上的
groupby
设置id,检查以下两行与
shift
不同的位置,并使用
cumsum
获取每组的增量值。为
map
chr
功能添加64

#dummy example
df = pd.DataFrame({'Cleaned':list('abbcddeffijkllmn'), 
                   'label_set_id':[1]*8+[2]*8})

#create the column label
df['label'] = list(map(chr, df.groupby('label_set_id')['Cleaned']\
                              .apply(lambda x: x.ne(x.shift()).cumsum())+64))

print (df)
   Cleaned  label_set_id label
0        a             1     A
1        b             1     B 
2        b             1     B #same cleaned than previous row 
3        c             1     C
4        d             1     D
5        d             1     D
6        e             1     E
7        f             1     F
8        f             2     A #restart at A for new label_set_id
9        i             2     B
10       j             2     C
11       k             2     D
12       l             2     E
13       l             2     E
14       m             2     F
15       n             2     G
编辑:如果数据是按标签\设置\ id排序的,则可以在不使用groupby的情况下进行编辑:

df['label'] = df['Cleaned'].ne(df['Cleaned'].shift()) .cumsum()
df['label'] = list(map(chr, df['label']
                            -df['label'].where(df['label_set_id'].ne(df['label_set_id'].shift()))\
                                        .ffill().astype(int) + 65 ))

你的输入和输出在我看来是一样的。我错过什么了吗?谢谢!这是一个很棒的解决方案,而且速度更快。@user3476463如果标签\u set\u id已排序(根据您的问题),请查看编辑,它可能会更快
df['label'] = df['Cleaned'].ne(df['Cleaned'].shift()) .cumsum()
df['label'] = list(map(chr, df['label']
                            -df['label'].where(df['label_set_id'].ne(df['label_set_id'].shift()))\
                                        .ffill().astype(int) + 65 ))