我正在使用文本数据,我只想根据现有列填充新列。
示例:列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])
数据框中只有20k行,但这段代码需要几分钟才能执行,之后永远不会完成并使我的浏览器无法响应(我使用ipython notebook
)。我原以为这会在几秒钟内完成。
这段代码中有什么显而易见的东西让我无法捕捉到吗?我该如何解决?
答案 0 :(得分:1)
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
首次使用pandas数据帧时,首先要尝试查找矢量化解决方案。并且只有在绝对不可能的情况下再仔细检查它并且只有在尝试循环通过方法之后,因为它会慢几个数量级。
OLD回答:
试试这个:
In [61]: x.sourceEncodedID.str.split('\.', expand=True)[1]
Out[61]:
0 b
1 r
2 None
3 None
Name: 1, dtype: object