Pandas重新标记行以识别组

时间:2016-09-16 02:50:11

标签: python pandas

我有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)

但这实际上并没有收回一系列词典,所以即便是我的第一步也是非首发。谢谢你的建议!

1 个答案:

答案 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