2017-02-23 102 views
3

例如,我有一個熊貓列包含分割一個大熊貓列文本到多個列

text 
A1V2 
B2C7Z1 

我想它分割成26(AZ)的列與字母隨後的值,如果它不存在,則-1 。

所以,它可以

text A B C D ... Z 
A1V2 1 -1 -1 -1 ... -1 
B2C7Z1 -1 2 7 -1 ... 1 

有沒有什麼快捷方式,而不是使用df.apply()?

後續行動: 感謝Psidom的出色答案。當我使用運行4百萬行的方法時,花了我1個小時。我希望還有另一種方式可以讓它更快。看起來str.extractall()是最耗時的。

回答

4

嘗試str.extractall用正則表達式(?P<key>[A-Z])(?P<value>[0-9]+),提取關鍵([A-Z])值([0-9] +)爲單獨的列和長到寬改造應該讓你那裏。

這裏正則表達式匹配(?P<key>[A-Z])(?P<value>[0-9]+)letterDigits圖案和兩個捕捉組進入兩個獨立的列中的結果作爲(與?P<>語法)列;

而且由於extractall把多個匹配到單獨的行,你需要將它與unstackkey列轉換爲寬幅:

(df.text.str.extractall("(?P<key>[A-Z])(?P<value>[0-9]+)") 
.reset_index('match', drop=True) 
.set_index('key', append=True) 
.value.unstack('key').fillna(-1)) 

#key A B C V Z 
# 0 1 -1 -1 2 -1 
# 1 -1 2 7 -1 1 
+0

這就是聰明! – MaxU

+0

這是一個很好的:) – Shijo

+0

@MaxU欣賞評論。 – Psidom