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

非常感谢,它成功了。你能指出我代码中不明显的愚蠢之处吗?谢谢你的解释,我很感激!我想这只是有点令人沮丧,因为人们必须了解熊猫的矢量化功能,而回到基本功能需要花费大量时间。我同意矢量化解决方案更简洁,但你必须了解它们。一次一个功能!!