2017-02-24 72 views
1

我創建了一個數據幀DF在那裏我有一個具有以下值的列:蟒蛇熊貓部分字符串匹配

category 
20150115_Holiday_HK_Misc 
20150115_Holiday_SG_Misc 
20140116_DE_ProductFocus 
20140116_UK_ProductFocus 

我要創建3分新列

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 

在A列,我想取出「_HK」 - 我想我需要手動編碼這個,但這很好,我有所有國家代碼的列表

在B列中,它是非常國家代碼

列C,列A沒有日期在開始

我想這樣的事情,但沒有得到很遠。

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

謝謝

+0

我在考慮一些字符串方法,如'.split()'例如 – AsheKetchum

+0

除非你的字符串不是所有的結構以同樣的方式,所以它不會讓你在什麼地方你想成爲。 – AsheKetchum

回答

5

您可以使用Series.str.extract()方法:

# 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) 

結果:

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

你介意解釋前兩行嗎? – AsheKetchum

+0

@AsheKetchum,當然,請參閱更新:-) – MaxU

+0

使用列A.Extract for C非常聰明。使正則表達式更具可讀性。 – Vaishali

1

您還可以使用正則表達式和應用

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

結果

    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