2016-11-08 3 views
0

У меня есть столбец dataframe со строками, представляющими пути. Я хотел бы использовать часть этого пути как значение в другом столбце.Разбор строки dataframe для значения столбца

Струны похожи на следующее и в колонке под названием 'Image Location'

C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D2\Image9.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D6\Image7.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D7\Image3.tif 
... 
C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image7.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image1.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image6.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D3\Image4.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D3\Image9.tif 
... 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image4.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image9.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image3.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image7.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image1.tif 
C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image6.tif 

Прямо сейчас я делаю следующее:

df['Interval'] = df['Image Location'].str.split('\\').apply(lambda x: x[5]) 
df['Device'] = df['Image Location'].str.split('\\').apply(lambda x: x[6]) 

Это явно требует путь не менять очень потому что я подсчитываю число \, чтобы найти значения Interval и Device.

Мне интересно, есть ли более надежный способ сделать это. Например, возможно найти шаблон, такой как Day # и D# Любые мысли будут оценены.

ответ

1

я хотел бы использовать Series.str.extract() метод:

In [40]: df[['Interval','Device']] = \ 
      df['Image Location'].str.extract(r'([^\\]+)\\([^\\]+)\\[^\\]+$', expand=True) 

In [41]: df 
Out[41]: 
               Image Location Interval Device 
0 C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D2\Image9.tif Day 4  D2 
1 C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D6\Image7.tif Day 4  D6 
2 C:\Users\Chris H\Desktop\20161017HCT116\Day 4\D7\Image3.tif Day 4  D7 
3 C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image7.tif Day 6  D2 
4 C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image1.tif Day 6  D2 
5 C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D2\Image6.tif Day 6  D2 
6 C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D3\Image4.tif Day 6  D3 
7 C:\Users\Chris H\Desktop\20161017HCT116\Day 6\D3\Image9.tif Day 6  D3 
8 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image4.tif Day 8  D1 
9 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image9.tif Day 8  D1 
10 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D1\Image3.tif Day 8  D1 
11 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image7.tif Day 8  D2 
12 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image1.tif Day 8  D2 
13 C:\Users\Chris H\Desktop\20161017HCT116\Day 8\D2\Image6.tif Day 8  D2 

Here is parsed and explained RegEx

Регулярное выражение в этом решении предполагается, что две последние части пути (каталоги) всегда: Interval и Device соответственно.

Это не имеет значения, сколько \ (спина слэш) есть в начале пути

+0

Очень интересное решение. – agf1997

1

Если вы не хотите зависеть от количества \-х, вы можете сделать что-то подобное :

df['Image Location'].map(lambda x: re.findall(r'(?<=Day)[0-9]+', x)).map(lambda x: np.nan if not x else x[0]) 
df['Image Location'].map(lambda x: re.findall(r'(?<=D)[0-9]+', x)).map(lambda x: np.nan if not x else x[0]) 

Это первый найдет подстроку Day (или D) и вернуть номера, которые непосредственно следуют за этим. Таким образом, он предполагает, что в этой строке нет другого такого шаблона, поскольку он будет отображать все шаблоны, такие как D, за которым следует любое количество цифр.

UPDATE: Похоже, что использовать Series.str.extract как предложено @MaxU. Вот он:

df['Image Location'].str.extract('[Day ]([0-9]+)') 
df['Image Location'].str.extract('[D]([0-9]+)') 
+0

Это было направление, о котором я думал первоначально. Я не уверен, какое решение лучше, это или одно из @MaxU. Кажется, он был бы устойчив к изменению пути между \ Day # и \ D #, например. 'C: \ Users \ Chris H \ Desktop \ 20161017HCT116 \ Day 8 \ запустить 1 \ D2 \ Image6.tif', но это вряд ли произойдет. Решение Max является надежным для Интервала, меняющегося от Дней к Часам 'C: \ Users \ Chris H \ Desktop \ 20161017HCT116 \ 48 hr \ D2 \ Image6.tif' Это, вероятно, более вероятно, но оба являются отличными решениями! – agf1997

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