Python MapReduce - 在Mapper中跳过.csv文件的第一行

3

我正在尝试在Python中进行MapReduce,我的CSV文件如下所示:

    trip_id taxi_id pickup_time dropoff_time ... total
0   20117   2455.0  2013-05-05   09:45:00         50.44
1   44691   1779.0  2013-06-24   11:30:00         66.78

我的代码如下:

import pandas as pd
import numpy as np
from mrjob.job import MRJob

class MRCount(MRJob):

def mapper(self, _, line):
    datarow = line.replace(' ','').replace('N/A','').split(',')
    trip_id = datarow[0]
    total = datarow[14]
    total = np.float(total)
    yield ((trip_id), (total))

由于我的代码将所有行传递给映射器,因此它以字符串行(索引)开头,但我想玩的是浮点型的总数,因此当我运行文件时,会出现错误。

TypeError: float() argument must be a string or a number, not 'generator'

当处理映射函数时,我应该如何跳过CSV文件的第一行?

通常情况下,在没有循环的函数中,将唯一的yield作为最后一行是没有意义的。你在使用mapper做什么? - Stephen Rauch
1
@StephenRauch 如果它是函数内循环体的最后一行,怎么办 :) - user2390182
@StephenRauch 我想在csv文件的每一行中匹配trip_id和total,我有另一个命令行从csv文件逐行传递,python3 test.py --jobconf mapreduce.job.reduces=1 CSTaxiTrips.csv。我是否需要在mapper函数中打开csv文件并使用next()函数跳过第一行? - TTaa
1个回答

3

我不确定“line”具体指的是什么内容。解决你的问题的简单方法是对浮点数使用try/except语句。

def mapper(self, _, line):
    datarow = line.replace(' ','').replace('N/A','').split(',')
    trip_id = datarow[0]
    total = datarow[14]
    try:
        total = np.float(total)
    except TypeError:
        print("skipping line with value", datarow[14])
    else:
        yield ((trip_id), (total))

行有内容(第一行)trip_id taxi_id pickup_time dropoff_time ... total (第二行)0 20117 2455.0 2013-05-05 09:45:00 50.44 (第三行)1 44691 1779.0 2013-06-24 11:30:00 66.78 但是仍然给我错误,我认为每次读取行时,它都会将每个值转换为字符串。 - TTaa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接