0

ASCII ファイルからのデータの読み取りを処理する小さなクラスを作成しようとしています。以下は私が書いたコードです。

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ですか?

4

1 に答える 1

1

DataFrame の呼び出しの一部としてこれを明示的に行う方法がわかりません。この問題に遭遇したとき、私は次のいずれかで事後にキャストしました:

各列に型を渡す:

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

ただし、関数を渡しているため、おそらく次を使用する必要があります。

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

また、パンダには、ベクトル化された文字列メソッドが組み込まれているため、次のことができます。

self.sample['msg'].str.strip()
于 2013-02-28T15:30:48.627 に答える