2016-06-22 5 views
1

Я пытаюсь разрезать столбец pandas под названием PATH из DataFrame, называемый dframe, чтобы я получил имя файла контейнера ad1 с расширением в новом столбце AD1position.Нарезка столбца pandas на основе позиции соответствующей подстроки

  PATH 
0   \ 
1   \abc.ad1\xaxaxa 
2   \defghij.ad1\wbcbcb 
3   \tuvwxyz.ad1\ydeded 

Другими словами, вот что я хочу видеть:

  PATH      AD1position 
0   \ 
1   \abc.ad1\xaxaxa   abc.ad1 
2   \defghij.ad1\wbcbcb  defghij.ad1 
3   \tuvwxyz.ad1\ydeded  tuvwxyz.ad1 

Если бы я должен был сделать это в Excel, я хотел бы написать:

=if(iserror(search(".ad1",[PATH])),"",mid([PATH],2,search(".ad1",[PATH]) + 3)) 

В Python, я, кажется, застрять. Вот что я писал до сих пор:

dframe['AD1position'] = dframe['PATH'].apply(lambda x: x['PATH'].str[1:(x['PATH'].str.find('.ad1')) \ 
            + 3] if x['PATH'].str.find('.ad1') != -1 else "") 

Выполнение этого возвращает следующее сообщение об ошибке:

TypeError: string indices must be integers 

Я подозреваю, что проблема вызвана функцией в ломтерезки, но я бы признателен за любую помощь выясняя, как это решить.

ответ

0

использование .str.extract() функции:.

In [17]: df['AD1position'] = df.PATH.str.extract(r'.*?([^\\]*\.ad1)', expand=True) 

In [18]: df 
Out[18]: 
        PATH AD1position 
0     \   NaN 
1    \aaa\bbb   NaN 
2    \byz.ad1  byz.ad1 
3  \abc.ad1\xaxaxa  abc.ad1 
4 \defghij.ad1\wbcbcb defghij.ad1 
5 \tuvwxyz.ad1\ydeded tuvwxyz.ad1 
+0

Это был лучший ответ. Он ответил, что я также обновил свои панды до 18.1, чтобы я мог использовать аргумент expand. Похоже, ваша функция охватывает возможность того, что PATH будет «\ aaa \ axy.ad1 \ bbbbb», но я не уверен, что он будет обрабатывать такие значения, как «\ byz.ad1» (т. Е. Без \ в конце) или «\ def.ad1.ad1 \ ccccc» (т. е. повторение расширений в имени файла), но я думаю, что мне должно быть хорошо отсюда. – Xavier

+0

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

0

Это даст вам первый элемент раскола.

df['AD1position'] = df.PATH.str.split('\\').str.get(1) 

Thank you Root.

+0

Вы можете сделать 'df.PATH.str.split ('\\') str.get (1)', но часть пути, содержащий '» .ad1'' всегда будет элементом 1? Это в данных примера, но мне непонятно, может ли это быть так. – root

+0

Я не вижу встречного примера. Метод KISS необходим. – Back2Basics

+0

Как это работает? (не 2-я «str» переводит список в строку?), не следует ли это вернуть одну букву? Да, я пробовал, и он работает, но ... КАК? – Back2Basics

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