2017-02-23 85 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