我有Pandas DataFrame
描述了一些版本测试,如下所示:
MailingName EmailSubject MailingID
Promo_v1s1 Hello! A8FEFE
Promo_v1s2 Line 2 A8FEFE
Promo_v2s1 Line 2 A8FEFE
Promo_v2s2 Yo! A8FEFE
Promo_v2S3 Hello! A8FEFE
deal_v2s1 Line 2 bbb
deal_v2s2 Yo! bbb
deal_v2ss Hello bbb
MailingID
可以识别具有不同版本测试的相同邮件广告系列(因此,groupby
这个术语可以用于更多特征。)
MailingName
的命名约定是v + a number
表示已测试的电子邮件正文版本,s + a number
表示在特定组合中测试的电子邮件主题行。但是,即使在共享mailingID时,v1s1
中的主题行不一定与v2s2
中的主题行相同,这种约定也没有帮助。
我想在每个MailingID
组中,让所有实际上相同的电子邮件主题行具有相同的“主题行版本号”。所以我想创建另一个列,结果如下:
MailingName EmailSubject MailingID TrueEmailVersionNumber
Promo_v1s1 Hello! A8FEFE 1
Promo_v1s2 Line 2 A8FEFE 2
Promo_v2s1 Line 2 A8FEFE 2
Promo_v2s2 Yo! A8FEFE 3
Promo_v2S3 Hello! A8FEFE 1
deal_v2s1 Line 2 bbb 1
deal_v2s2 Yo! bbb 2
deal_v2ss Hello bbb 3
基本上我想为每个组添加一个唯一标签。如何使用Pandas
?
我有一个想法,就像这样一个笨重的方式开始:
def processThis(x):
uni = list(set(x))
keys = {x_i:uni.index(x_i) for x_i in x}
return keys
ab_data.groupby('mailing_id')['subject'].apply(processThis)
但这实际上并没有收回一系列词典,所以即便是我的第一步也是非首发。谢谢你的建议!
答案 0 :(得分:1)
In [229]: df
Out[229]:
MailingName EmailSubject MailingID
0 Promo_v1s1 Hello! A8FEFE
1 Promo_v1s2 Line 2 A8FEFE
2 Promo_v2s1 Line 2 A8FEFE
3 Promo_v2s2 Yo! A8FEFE
4 Promo_v2S3 Hello! A8FEFE
5 deal_v2s1 Line 2 bbb
6 deal_v2s2 Yo! bbb
7 deal_v2ss Hello bbb
In [230]: def f(x):
...: unq = list(x['EmailSubject'].unique())
...: return pd.Series([unq.index(y) + 1 for y in x['EmailSubject']])
...:
In [231]: df['TrueEmailVersionNumber'] = df.groupby('MailingID').apply(f).values
In [232]: df
Out[232]:
MailingName EmailSubject MailingID TrueEmailVersionNumber
0 Promo_v1s1 Hello! A8FEFE 1
1 Promo_v1s2 Line 2 A8FEFE 2
2 Promo_v2s1 Line 2 A8FEFE 2
3 Promo_v2s2 Yo! A8FEFE 3
4 Promo_v2S3 Hello! A8FEFE 1
5 deal_v2s1 Line 2 bbb 1
6 deal_v2s2 Yo! bbb 2
7 deal_v2ss Hello bbb 3