2017-02-24 3 views
1

ich einen Datenrahmen df erstellt, wo ich eine Spalte mit den folgenden Werten haben:Python Pandas Teilstring Spiel

category 
20150115_Holiday_HK_Misc 
20150115_Holiday_SG_Misc 
20140116_DE_ProductFocus 
20140116_UK_ProductFocus 

I 3 neue Spalten erstellen möchten

category     |   A    | B |  C  
20150115_Holiday_HK_Misc  20150115_Holiday_Misc  HK Holiday_Misc 
20150115_Holiday_SG_Misc  20150115_Holiday_Misc  SG Holiday_Misc 
20140116_DE_ProductFocus  20140116_ProductFocus  DE ProductFocus 
20140116_UK_ProductFocus  20140116_ProductFocus  UK ProductFocus 

in Spalte A, ich will herausnehmen "_HK" - Ich denke, ich muss das manuell codieren, aber das ist in Ordnung, ich habe die Liste aller Ländercodes

In Spalte B ist es genau dieser Ländercode

Spalte C, ist Spalte A ohne das Datum am Anfang

Ich versuche so etwas, aber nicht weit.

df['B'] = np.where([df['category'].str.contains("HK")==True], 'HK', 'Not Specified') 

Danke

+0

Ich bin wie '.split über einige String-Methoden zu denken()' zum Beispiel – AsheKetchum

+0

Außer Saiten sind nicht alle die gleiche Art und Weise strukturiert, so dass es nicht Sie genau funktioniert, wo Sie will sein. – AsheKetchum

Antwort

5

Sie Series.str.extract() Methode verwenden:

# remove two characters (Country Code) surrounded by '_' 
df['A'] = df.category.str.replace(r'_\w{2}_', '_') 
# extract two characters (Country Code) surrounded by '_' 
df['B'] = df.category.str.extract(r'_(\w{2})_', expand=False) 
df['C'] = df.A.str.extract(r'\d+_(.*)', expand=False) 

Ergebnis:

In [148]: df 
Out[148]: 
        category      A B    C 
0 20150115_Holiday_HK_Misc 20150115_Holiday_Misc HK Holiday_Misc 
1 20150115_Holiday_SG_Misc 20150115_Holiday_Misc SG Holiday_Misc 
2 20140116_DE_ProductFocus 20140116_ProductFocus DE ProductFocus 
3 20140116_UK_ProductFocus 20140116_ProductFocus UK ProductFocus 
+0

Macht es Ihnen etwas aus, die ersten 2 Zeilen zu erklären? – AsheKetchum

+0

@AsheKetchum, sicher, bitte siehe update :-) – MaxU

+0

Die Spalte A.extract für C ist ziemlich intelligent. Macht die Regex viel lesbarer. – Vaishali

1

Sie können auch Regex nutzen und anwenden

import re 
df['A'] = df.category.apply(lambda x:re.sub(r'(.*)_(\w\w)_(.*)', r'\1_\3', x)) 
df['B'] = df.category.apply(lambda x:re.sub(r'(.*)_(\w\w)_(.*)', r'\2', x)) 
df['C'] = df.A.apply(lambda x:re.sub(r'(\d+)_(.*)', r'\2', x)) 

Ergebnis

    category      A B    C 
0 20150115_Holiday_HK_Misc 20150115_Holiday_Misc HK Holiday_Misc 
1 20150115_Holiday_SG_Misc 20150115_Holiday_Misc SG Holiday_Misc 
2 20140116_DE_ProductFocus 20140116_ProductFocus DE ProductFocus 
3 20140116_UK_ProductFocus 20140116_ProductFocus UK ProductFocus