将一个pandas列文本拆分为多个列

时间:2017-02-23 19:17:57

标签: python pandas

例如,我有一个pandas列包含

text
A1V2
B2C7Z1

我希望将其拆分为26个(A-Z)列,其中字母后跟值,如果缺少,则为-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()是最耗时的。

1 个答案:

答案 0 :(得分:5)

尝试使用正则表达式str.extractall (?P<key>[A-Z])(?P<value>[0-9]+),将密钥( [AZ] )值( [0-9] + )提取到单独的列和长到宽的变换应该可以帮助你。

此处正则表达式(?P<key>[A-Z])(?P<value>[0-9]+) letterDigits 模式匹配,并且两个捕获组在结果中分为两列,分别为列(使用?P<>语法);

由于 extractall 将多个匹配放入不同的行,您需要在unstack列上使用key将其转换为宽格式:

(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