从python和Spark中的unicode字符串中删除负号

时间:2015-11-30 09:25:13

标签: python unicode apache-spark

我有一个数据集,其中一列在该列的某些数字前面有negative sign (-),数据在unicode string。我想从有号码的前面删除-符号。这就是我试过的:

def extract(line):

    #label = '{:,.2f}'.format(abs(line[4]))
    label = '{:,.2f}'.format(str(float(line[4]))).lstrip("-")
    return (line[0],line[1],line[2],line[3],label)

Data = sc.textFile('file1.csv').zipWithIndex().filter(lambda (line,rownum): rownum>0).map(lambda (line, rownum): line)

input_rdd = (inputData
    .map(lambda line: line.split(","))
    .filter(lambda line: len(line) >1 )
    .map(extract)) 

input_data = input_rdd.collect()

当我执行此操作时,我收到错误:ValueError: Unknown format code 'f' for object of type 'str'。我也尝试使用abs()(在上面的代码中注释掉的行),但这也会导致错误wrong type for abs()。如何从-移除unicode string符号?

这就是我的示例数据:

Level1,Male,New York,New York,3528 
Level2,Male,Columbus,Ohio,-4958

如果我在上面的代码中只做了return (line[0],line[1],line[2],line[3],line[4])并打印了rdd,那么我就明白了:

[(u'Level1', u'Male', u'New York', u'New York', u'3528'), (u'Level2', u'Male', u'Columbus', u'Ohio', u'-4958'),....]

正如您所看到的,每行或元素的最后一列中的某些值是负的unicode字符串。

2 个答案:

答案 0 :(得分:1)

如果你特别想要的列是0,1,2,3和最后一列(格式化),那么试试这个:

def extract(line):
    return (line[:4]) + ('{:,.2f}'.format(abs(float(line[-1]))),)

答案 1 :(得分:0)

为什么不使用re模块 它有一个名为sub的方法,可用于替换字符。 在你的情况下

re.sub("-","","-6.789")

=> 6.789