2013-02-27 11 views
0

我想創建一個小類來處理從ASCII文件讀取數據。以下是我寫的代碼。如何在構建DataFrame時模擬轉換器?

class EyelinkParser(object): 
    eyesample = namedtuple('Eyesample', ('time', 'x', 'y', 'pupil')) 
    etevent = namedtuple('EyeTrackerEvent', ('time', 'msg')) 
    _pos_cnvrt = lambda v: float(v.strip()) if '.' not in v else str('NaN') 
    converters = {'time': lambda t: int(t.strip()), 
        'x': _pos_cnvrt, 
        'y': _pos_cnvrt, 
        'pupil': _pos_cnvrt, 
        'msg': lambda s: s.strip() 
       } 

    def __init__(self, fileobj): 
     self.fileobj = fileobj 
     self.started = False 

     self.sample = [] 
     self.event = [] 

     self.parse() 

    def parse(self): 
     for line in self.fileobj: 
      line = line.split('\t') 
      if line[0] in ['START', 'END']: 
       self.started = line[0] == 'START' 

      if self.started: 
       self.process_line(line) 

     self.sample = pd.DataFrame(self.sample, columns=['time', 'x', 'y', 'pupil'], converters=self.converters) 
     self.event = pd.DataFrame(self.event, columns=['time', 'msg'], converters=self.converters) 

    def process_line(self, line): 
     if len(line) == 2 and line[0] == 'MSG': 
      msg_data = line[1].split() 
      if len(msg_data) == 2: 
       self.event.append(self.etevent(*msg_data)) 
     elif len(line) == 4: 
      # TODO: replace '.' with NaNs 
      self.sample.append(self.eyesample(*line)) 

顯然DataFrame類不支持轉換器。有沒有簡單的方法來完成我想要做的事情?

總之,我怎麼可以指定在DataFrame的每一列的值的類型轉換?

回答

1

我不知道該怎麼做明確以此爲調用數據幀的一部分。

傳遞一個類型,每一列:

self.sample['x'].astype(int) 

但因爲你傳遞的功能,你可能需要當我碰到的這個問題,我用下面的事實之後鑄造使用以下:

self.sample['x'].map(_pos_cnvrt) 
self.sample['msg'].map(lambda s:s.strip()) 

此外,熊貓擁有一些量化的字符串方法烤制的幫助:

self.sample['msg'].str.strip() 
+0

哇,太棒了!我不知道有用字符串方法烘焙過的東西,雖然我以前見過'astype',但我完全忘了它。非常感謝! – blz 2013-02-28 20:38:10