【问题标题】:could not convert string to float'.'无法将字符串转换为浮点数'。'
【发布时间】:2021-06-15 01:44:08
【问题描述】:

我在 python 中生成了 2 列,我将它们转换为一个 np 数组,并设法将它们保存在一个新文件中。

fi = np.array([co,pred[40]])
fi=fi.T
np.savetxt("Pred_40.dat", fi, delimiter=" ")

现在我想创建一个内部函数来读取我的新文件。我做了,但我得到一个错误告诉我:无法将字符串转换为浮点数'。'

def open_vmodel(vmodel_file,n_lag):
  list_ = []
  index = []
  vargplot = open(vmodel_file)
  for i in range(n_lag):
      dm = vargplot.readline()
      list_.append(list(map(float,dm))) 
  result = pd.DataFrame(list_)
  result.columns = ['Lag Distance','Variogram Value']
  istart = 0

      
  return pd.DataFrame(result)
vmodel_df = open_vmodel("Pred_40.dat",n_lag=1)

【问题讨论】:

  • 您能详细说明一下吗?什么是cofi的形状和内容dtype是什么
  • 嗨,约翰,我只是将它们添加到我的问题中,谢谢
  • 错误表明dm 行中有一个“裸”'。特点。您/我们需要查看文件,读取为dm 的行。
  • 0.000000000000000000e + 00 0.000000000000000000e + 00 0.000000000000000000e + 00 0.000000000000000000e + 00 1.000000000000000000e + 01 5.626957416534423828e-01 2.000000000000000000e + 01 8.429691195487976074e-01 3.000000000000000000e + 01 9.505254626274108887e-01 4.000000000000000000e +01 9.935916662216186523e-01 5.000000000000000000e+01 1.007314443588256836e+00
  • 它们被分隔为 2 列

标签: python arrays pandas numpy jupyter-notebook


【解决方案1】:

你可以使用dm = vargplot.readline().replace(".","") 吗?有一个点,所以也许它会解决你的问题。

【讨论】:

  • 我试过了,我得到:无法将字符串转换为浮点数:','
  • dm = vargplot.readline().replace(".","").replace(",","")
  • 也请试试这个
  • could not convert string to float: 'e' cause when I save the values got 5.62695e-01
  • 那么使用正则表达式呢?你能用 dm = vargplot.readline() dm = re.findall("\d+\.\d+",dm) 吗?
【解决方案2】:

也许这是本地化的问题,因为某些地区使用逗号而不是点来表示小数位。当您转换为浮动时,其中一个数字可能类似于0.2,而Python 可能期望0,2

import locale
locale.setlocale(locale.LC_NUMERIC,"C")

这会将数字格式设置为标准格式,即接受0.5 而不是0,5

【讨论】:

  • @KarimMokdad 我很确定list(map(float, dm)) 是错误的。它尝试将 dm 的每个字符解析为一个数字,因此当它尝试解析 '.' 时作为一个数字它失败了。也许试试list(map(float, dm.split()))
  • 我设法改变了它,但使用相同的概念并且它可以工作,谢谢
【解决方案3】:

我很确定list(map(float, dm)) 是错误的。它尝试将 dm 的每个字符解析为数字,因此当它尝试解析 '.' 时作为一个数字它失败了。也许试试list(map(float, dm.split()))

【讨论】:

    【解决方案4】:

    带有您的文件样本(来自评论):

    In [218]: txt="""0.000000000000000000e+00 0.000000000000000000e+00 
         ...: 0.000000000000000000e+00 0.000000000000000000e+00 
         ...: 1.000000000000000000e+01 5.626957416534423828e-01"""
    
    In [220]: txt = txt.splitlines()
    In [221]: txt
    Out[221]: 
    ['0.000000000000000000e+00 0.000000000000000000e+00 ',
     '0.000000000000000000e+00 0.000000000000000000e+00 ',
     '1.000000000000000000e+01 5.626957416534423828e-01']
    

    您的地图迭代一行的所有字符:

    In [222]: list(map(float, txt[0]))
    Traceback (most recent call last):
      File "<ipython-input-222-47473c6c14f7>", line 1, in <module>
        list(map(float, txt[0]))
    ValueError: could not convert string to float: '.'
    
    In [223]: list(txt[0])[:10]
    Out[223]: ['0', '.', '0', '0', '0', '0', '0', '0', '0', '0']
    

    但是,如果您首先按照https://stackoverflow.com/a/66678555/901925 的建议将行拆分为空格

    In [224]: list(map(float, txt[0].split()))
    Out[224]: [0.0, 0.0]
    

    或多行(我更喜欢列表理解而不是地图):

    In [225]: res = []
         ...: for dm in txt:
         ...:     res.append([float(i) for i in dm.split()])
         ...: 
    In [226]: res
    Out[226]: [[0.0, 0.0], [0.0, 0.0], [10.0, 0.5626957416534424]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多