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