Python 构造数据帧时,如何模拟转换器?
我正在尝试创建一个小类来处理从ASCII文件读取数据。下面是我写的代码Python 构造数据帧时,如何模拟转换器?,python,pandas,Python,Pandas,我正在尝试创建一个小类来处理从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
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
类不支持转换器。有没有一个简单的方法来完成我想做的事情
总之,如何在
数据帧的每一列中指定值的类型转换?我不知道如何作为调用数据帧的一部分显式执行此操作。当我遇到这个问题时,我会用以下任何一种方法来追踪事实:
将类型传递给每个列:
self.sample['x'].astype(int)
但由于您正在传递函数,因此可能需要使用以下内容:
self.sample['x'].map(_pos_cnvrt)
self.sample['msg'].map(lambda s:s.strip())
此外,pandas还提供了一些烘焙的矢量化字符串方法来帮助:
self.sample['msg'].str.strip()
哇,太棒了!我不知道有烘焙的字符串方法,尽管我以前见过astype
,但我已经完全忘记了它。多谢!