我正在处理文本数据,我只想根据现有列填充新列。

例如:列sourceEncodedID可能具有类似a.b.c的值,如果有第二部分可用,我只想提取字符串的第二部分b。以下是一些示例值:

sourceEncodedID    Branch
a.b.c               b
c.r.d               r
a                   a
p                   p


为此,我提出了以下代码:

for i in range(0,20350):
    if len(str(artifacts.sourceEncodedID[i]).split('.')) > 1:
        artifacts['branch'][i] = str(artifacts.sourceEncodedID[i]).split('.')[1]
    else:
        artifacts['branch'][i] = str(artifacts.sourceEncodedID[i])


数据框中只有2万行,但是这段代码要花几分钟的时间执行,然后才能完成浏览器并使之无响应(我正在使用ipython notebook)。我以为这会在几秒钟内运行。

这段代码中我显然无法捕捉到一些愚蠢的东西吗?我如何解决它?

最佳答案

UPDATE2:-我相信这样做会更快:

x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1')


在20K DF上计时:

In [155]: x.shape
Out[155]: (20000, 2)

In [156]: %timeit x['new'] = x.sourceEncodedID.str.replace(r'[^\.]*\.([^\.]*).*', r'\1')
10 loops, best of 3: 127 ms per loop


更新:

In [68]: x['new'] = x.sourceEncodedID

In [69]: x
Out[69]:
  sourceEncodedID Branch    new
0           a.b.c      b  a.b.c
1           c.r.d      r  c.r.d
2               a      a      a
3               p      p      p

In [70]: x.ix[x.sourceEncodedID.str.contains('\.'), 'new'] = x.sourceEncodedID.str.split('\.', expand=True)[1]

In [71]: x
Out[71]:
  sourceEncodedID Branch new
0           a.b.c      b   b
1           c.r.d      r   r
2               a      a   a
3               p      p   p


当使用熊猫数据帧时,首先总是尝试找到矢量化解决方案。而且,只有在绝对不可能的情况下,才进行仔细检查,并在尝试循环遍历之后再进行检查,因为这样做会慢几个数量级。

旧答案:

尝试这个:

In [61]: x.sourceEncodedID.str.split('\.', expand=True)[1]
Out[61]:
0       b
1       r
2    None
3    None
Name: 1, dtype: object

10-04 13:00
查看更多