【问题标题】:converters for python pandaspython pandas的转换器
【发布时间】:2012-09-13 10:18:39
【问题描述】:

我有一个 .txt 数据,其中第 6 列和第 7 列是 GPS 位置,格式为:

50;18.5701400N,4;07.7693770E

当我通过 read_csv 读取它时,我尝试使用转换器将其转换为笛卡尔坐标。我为转换器编写了函数

convertFunc = lambda x : float((x[0:5]+x[6:12]).replace(';','.'))
convert = {6:convertFunc,7:convertFunc}

当我在单个值上使用它时,它会按照我的意愿工作:

convertFunc(myData.Lat[1])
Out [159]:  55.187110250000003

当我尝试在 read_csv 中使用它时它不起作用

myData = DataFrame(read_csv('~/data.txt', sep=',' names=['A', 'B', 'C', 'D', 'E', 'Lat', 'Long'],converters=convert))

我有一个错误:

...
convertFunc = lambda x : float((x[0:5] + x[6:12]).replace(';', '.'))
ValueError: invalid literal for float(): DGPS ongitu

我不知道哪里做错了,或者我对转换器有什么误解? 或者也许有人知道以这种形式处理 GPS 数据的好方法(包)?

(我认为lambda 可能有问题当我想将我的函数应用于列时出现错误:TypeError: only length-1 arrays can be converted to Python scalars

【问题讨论】:

  • 您似乎正在尝试转换标题行...尝试离开names=,以便read_csv 从标题行获取列名。
  • 感谢您的回复。我删除了names= 但它没有改变,有同样的错误。
  • 嗯,试试skiprows=1?也许发布您的data.txt 的样本,以便清楚问题所在。

标签: python pandas


【解决方案1】:

那个转换器有点老套;我可以推荐一些像这样更强大的东西吗?

def convert_dmds(s):
    deg, min = s[:-1].split(';')
    sign = 1 if s[-1] in 'NE' else -1
    return sign * (float(deg) + float(min) / 60.0)

def convert_gps(s):
    lat, lon = s.split(',')
    return (convert_dmds(lat), convert_dmds(lon))

此外,该错误表明您正在尝试转换明显不是 GPS 字符串的内容——也许是标题行?

【讨论】:

    【解决方案2】:

    您的转换器不正常。

    In [67]: convertFunc = lambda x : float((x[0:5]+x[6:12]).replace(';','.'))
    
    In [68]: convertFunc('4;07.7693770E')
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    ...
    ValueError: invalid literal for float(): 4.07.693770
    

    在一个狡猾的转换器之上,我认为你将转换器应用于错误的列(看看你得到的异常)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多