2016-11-08 56 views
0

我有一個數據幀列,其中包含表示路徑的字符串。我想將其中一些路徑用作另一列中的值。解析列值的數據幀字符串

字符串是類似於以下,並在標題爲'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]) 

這顯然需要路徑不發生很大的變化因爲我正在計算\的數量以找到間隔和設備值。

我想知道是否有更強大的方法來做到這一點。例如,也許找到一個模式,如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

正則表達式在此解決方案假定您最後兩個部分(目錄)總是:IntervalDevice水漲船高。

不要緊多少\(反斜槓)在路徑

+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,後面跟隨任意數量的數字。

更新: 看起來像@MaxU建議使用Series.str.extract更容易。 這裏是:

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 \ run 1 \ D2 \ Image6.tif'但這不太可能發生。 Max的解決方案對從間隔時間變化到時間間隔的C:\ Users \ Chris H \ Desktop \ 20161017HCT116 \ 48小時\ D2 \ – agf1997