将列表中的所有字符串转换为浮点数。适用于单个列表,但不适用于数据框

Posted

技术标签:

【中文标题】将列表中的所有字符串转换为浮点数。适用于单个列表,但不适用于数据框【英文标题】:Convert all strings in a list to float. Works on single list but not when applied to dataframe 【发布时间】:2020-05-09 22:46:53 【问题描述】:

我有一个带有地理位置的数据框df_tweets。地理位置存储在变量geo_loc 中,作为列表的字符串表示形式。它看起来像这样:

# Geocode values are stored as objects/strings
df_tweets.geo_code[0]

#Output:
'[-4.241751 55.858303]'

我测试了将geo_code 的一行转换为浮点数的经纬度列表:

# Converting string representation of list to list using strip and split 
# Can't use json.loads() or ast.literal_eval() because there's no comma delimiter

#--- Test with one tweet ----#

ini_list = df_tweets.geo_code[0]

# Converting string to list, but it will convert
# the lon and lat values to strings
# i.e. ['-4.241751', '55.858303']

results = ini_list.strip('][').split(' ') 

# So, we must convert string lon and lat to floats
results = list(map(float, results))

# printing final result and its type 
print ("final list", results) 
print (type(result))

这给了我:

# Output:
final list [-4.241751, 55.858303]
<class 'list'>

成功!除了没有。我把它写成一个辅助函数:

def str_to_float_list(list_as_str):
  ''' 
  Function to convert a string representation
  of a list into a list of floats
  using strip and split, when you can't use json.loads() 
  or ast.literal_eval() because there's no comma delimiter

  Parameter:
  str_ = string representation of a list.  
  '''

  # Convert string to list
  str_list = list_as_str.strip('][').split(' ')

  # Convert strings inside list to float
  float_list = list(map(float, str_list[0]))

  return float_list

当我跑步时:

df_tweets['geocode'] = df_tweets['geo_code'].apply(str_to_float_list)

当它遇到减号- 时,它会给我一个ValueError。我想不通为什么?!我错过了什么?

这是完整的错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-94-c1035312dc12> in <module>()
     20 
     21 
---> 22 df_tweets['geocode'] = df_tweets['geo_code'].apply(str_to_float_list)

1 frames
pandas/_libs/lib.pyx in pandas._libs.lib.map_infer()

<ipython-input-94-c1035312dc12> in str_to_float_list(list_as_str)
     15 
     16   # Convert strings inside list to float
---> 17   float_list = list(map(float, str_list[0]))
     18 
     19   return float_list

ValueError: could not convert string to float: '-'

【问题讨论】:

您的号码中有“-”之类的特殊字符?请尝试,除了查看哪一行返回错误代码 @YOandBEN_W 是的,经度的减号。但是在单个列表上运行代码时这不是问题。所以我不知道为什么,为什么申请整个专栏,不让我。 【参考方案1】:

在你的第 17 行,

float_list = list(map(float, str_list[0]))

您不需要引用索引。像这样将整个列表传递给列表。

float_list = list(map(float, str_list))

原因是 str_list[0] 是一个字符串对象,所以它试图把它当作一个列表,并迭代地转换每个值,从将“-”转换为浮点数开始,然后将“4”转换为”等。

【讨论】:

这完全有道理。解决了ValueError: could not convert string to float: '-',但现在提出了ValueError: could not convert string to float: 。想知道这是否与原始字符串的空间有关。但是str_list = list_as_str.strip('][').split(' ') 返回一个由逗号分隔的两个字符串的列表,所以不应该这样。我会用你的答案和新错误更新问题。 所以我尝试尽可能地复制您的代码,并将“结果”传递给一个方法。我遇到了一个不同的错误,但是当我在您的方法代码中删除“str_list = list_as_str.strip('][').split(' ')”行时,它立即起作用了,您是否像您的那样将该方法传递给列表变量“结果”,还是您将预处理的字符串传递给它?我相信 list(map(float,results)) 应该为您提供与 float 相同的列表,而无需使用辅助方法。除非我误解了正在传递的内容 谢谢。您的评论让我检查了正在通过的内容。我做了以下: ``` lon_lat = [] # For each row in a variable for row in df_tweets['geo_code']: # Convert string to list lon_lat = row.strip('][').split(' ' ) print (type(lon_lat)) # 将列表中的字符串转换为浮点数 lon_lat = list(map(float, lon_lat)) ``` 得到三个&lt;class 'list'&gt;,然后是值错误。问题是df_tweets['geocode'][2]。它之间有多个空格:[-3.1798 51.497002]。我可以为一个、两个和三个空格提出一个例外,看看情况如何。 嗯,是的。有很多解决方案。假设它永远不会超过 3 是一个答案。你可以使用正则表达式(不是我最喜欢的)。第三个是预处理,这是我个人会做的,迭代所有值并使它们保持一致。 是的,绝对不是唯一一个。必须进行预处理。谢谢您的帮助。将您的答案标记为解决方案,因为它确实解决了我原来的问题。

以上是关于将列表中的所有字符串转换为浮点数。适用于单个列表,但不适用于数据框的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中的某些整数上使用位操作中断将整数转换为浮点数

检查字符串是不是可以在 Python 中转换为浮点数

Pandas / 如何将存储为字符串的科学记数法转换为浮点数?

Python如何检查列表中的项目是不是为浮点数,如果是,将其更改为字符串? [复制]

在不将单个像素值转换为浮点数的情况下调整目标分割图的大小

ValueError:无法将字符串转换为浮点数:'GIAC'