2016-09-16 4 views
0

ich eine Pandas DataFrame haben, die eine Version Test beschreibt und sieht wie folgt aus:Pandas relabel Reihen eindeutige Werte innerhalb eines groupby zu erkennen

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 

Die gleiche Mailing-Aktion, mit anderen Version Tests können durch die MailingID identifiziert werden (Das wäre der groupby Begriff für mehr Eigenschaften).

Die Namenskonvention für MailingName für dies ist, dass v + a number die E-Mail-Körper-Version gibt, das getestet wurde, und s + a number zeigt die E-Mail-Betreffzeile, die in einer bestimmten Combo getestet wurden. Die Konvention ist jedoch nicht in dem Sinne hilfreich, dass die Betreffzeile von v1s1 nicht notwendigerweise dieselbe ist wie eine Betreffzeile in v2s2, selbst wenn die mailingID geteilt wird.

Ich möchte, innerhalb jeder MailingID Gruppe, haben alle E-Mail Betreffzeilen, die tatsächlich identisch sind, haben die gleiche 'Betreff Zeile Versionsnummer'. So würde Ich mag eine andere Spalte erstellen, die in so etwas wie dies zur Folge hätte:

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 

Grundsätzlich mag ich eindeutige Beschriftungen hinzufügen, pro Gruppe, an eine Säule. Wie kann ich das mit Pandas tun?

Ich hatte eine Idee, einen Starts in einer klobigen Quere wie so:

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) 

Aber das brachte eigentlich keine Liste der Wörterbücher zurück, so auch mein erster Schritt ist ein Rohrkrepierer. Danke für jeden Hinweis!

Antwort

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