Python 使用split在dataframe中填充列
我正在处理文本数据,我只想在现有列的基础上填充一个新列 示例:列Python 使用split在dataframe中填充列,python,pandas,dataframe,Python,Pandas,Dataframe,我正在处理文本数据,我只想在现有列的基础上填充一个新列 示例:列sourceencoded可能具有类似a.b.c的值,如果有第二部分可用,我只想提取字符串的第二部分b。以下是一些示例值: sourceEncodedID Branch a.b.c b c.r.d r a a p p 为了实现这一点,我提出了以下代码: for i i
sourceencoded
可能具有类似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笔记本
)。我本以为这会在几秒钟内完成
这段代码中是否有明显的愚蠢之处,我无法理解?如何修复它?更新2:-我相信这会更快一些:
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 [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
非常感谢,它成功了。你能指出我代码中不明显的愚蠢之处吗?谢谢你的解释,我很感激!我想这只是有点令人沮丧,因为人们必须了解熊猫的矢量化功能,而回到基本功能需要花费大量时间。我同意矢量化解决方案更简洁,但你必须了解它们。一次一个功能!!