Конвертировать все строки в списке, чтобы плавать. Работает с одним списком, но не применительно к данным - PullRequest
1 голос
/ 23 января 2020

У меня есть фрейм данных 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: '-'

1 Ответ

1 голос
/ 23 января 2020

В вашей строке 17,

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

Вам не нужно ссылаться на индекс. Передайте список всему списку, как это.

float_list = list(map(float, str_list))

Причина этого в том, что str_list [0] является строковым объектом, поэтому он пытается обработать его как список и итерационно преобразовывать каждое значение, начиная с преобразования «-» в число с плавающей запятой, затем будет преобразовано «4» и т. д. c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...