2016-05-31 3 views
2

Я работаю с текстовыми данными, и я просто хотел бы заполнить новый столбец на основе существующего столбца.Использование split для заполнения столбца в Dataframe Pandas

Пример: столбец 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 строк в dataframe и пока этот кусок коды занять минуты выполнить, прежде чем не закончите и не отрисуйте мой браузер (я использую ipython notebook). Я бы подумал, что это сработает через пару секунд.

В этом коде есть что-то явно глупое, что я не могу уловить? Как это исправить?

ответ

1

UPDATE2: - я считаю, что это будет немного быстрее:

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

Timing на 20К 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 

UPDATE:

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 
+0

спасибо, это сделало работу. Не могли бы вы указать на глупость, которая не очевидна для меня, в моем коде? – Patthebug

+0

@Patthebug, я обновил свой ответ - пожалуйста, проверьте – MaxU

+0

Спасибо за добавление объяснения, я ценю это! Я предполагаю, что это просто немного разочаровывает, потому что нужно знать векторизованные функции панд, а возврат к основам стоит вам с точки зрения времени. Я согласен, что векторизованные решения более аккуратные, но вы должны их знать. Одна функция за один раз! – Patthebug

 Смежные вопросы

  • Нет связанных вопросов^_^