我正在处理文本数据,我只想根据现有列填充新列。
例如:列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