Shapely l oop не создает линии Linestring - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь преобразовать кортежи из фрейма данных в строку строки. Это часть моего информационного кадра, импортированного из CSV-файла.

   Unnamed: 0      name     route                                              decode
0           0    Funshine!  ofosF|mqaShJ@?rLh@d@veCIVd@LbEJfJ^f@lE?Rp@^L~g...  '[(-105.28, 39.999), (-105.282, 39.998), (-105.282, 39.99), (-105.28, 39.995), (-105.282, 39.99), (etc)]'

Если я вручную скопирую и вставлю содержимое столбца декодирования в условие LineString (), оно преобразует его. Я получаю сообщение об ошибке ниже.

line = LineString(df.decode[0])
print(line)
Traceback (most recent call last):
  File "shapely\speedups\_speedups.pyx", line 86, in shapely.speedups._speedups.geos_linestring_from_py
AttributeError: 'str' object has no attribute '__array_interface__'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "C:/Users/taylo/PycharmProjects/PermitProj/Polyline Decode.py", line 20, in <module>
    line = LineString(df.decode[1])
  File "C:\Users\taylo\Miniconda3\envs\ExcelPermitExe\lib\site-packages\shapely\geometry\linestring.py", line 48, in __init__
    self._set_coords(coordinates)
  File "C:\Users\taylo\Miniconda3\envs\ExcelPermitExe\lib\site-packages\shapely\geometry\linestring.py", line 97, in _set_coords
    ret = geos_linestring_from_py(coordinates)
  File "shapely\speedups\_speedups.pyx", line 166, in shapely.speedups._speedups.geos_linestring_from_py
AssertionError


В конечном итоге я хотел бы l oop, поэтому я установил его для декодирования столбца данных. Это l oop, который я создал, чтобы в конечном итоге записать строку строки в столбец.

def linestringdecode(name, decode):
    try:
        return LineString(decode)
    except:
        print(name)
        return np.nan

df['decode'] = df.apply(lambda x: linestringdecode(x[1], x[3]), axis=1)

Как мне написать это, чтобы избежать этой ошибки и преобразовать кортежи в столбец в мой фрейм данных?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Изменить окончательное решение

После некоторой очистки выясняется, что столбец decode сохраняется в виде строки "[(1,1),(2,3),(4,4),(1,3)]", которую сначала необходимо преобразовать в список кортежей. , После преобразования с пониманием плотного списка преобразование LineString работает так, как предполагается:

df['decode'] = [eval(ele) for ele in df.decode.str.strip()[:]]
df['decode'] = df.apply(lambda x: linestringdecode(x[1], x[4]), axis=1)

Альтернатива Другой вариант go об этом - исправить импорт. Путем преобразования строки непосредственно в список кортежей напрямую с помощью ast.literal_eval, как предлагается в этом SO Вопрос

import ast
df = pd.read_csv("Test_Csv_With_List.csv", quotechar='"', sep=",",converters={4:ast.literal_eval})

Перед правкой: Я попытался воспроизвести вашу ошибку с кодом ниже. Тем не менее, он прекрасно работает без ошибок.

from shapely.geometry import LineString
import pandas as pd

def linestringdecode(name, decode):
    try:
        return LineString(decode)
    except:
        print(name)
        return np.nan

data = {'Unamed 0': [0,1],
        'name': ['test','test2'],
        'rote': ['Gibberish','moreGib'],
        'decode': [[(-105.27983, 40.06008), (-105.27984, 40.05827)],[(-23, 23), (-22, 24)]]}

df = pd.DataFrame(data)

# print(df)
df['decode'] = df.apply(lambda x: linestringdecode(x[1], x[3]), axis=1)

Из вашего сообщения об ошибке AttributeError: 'str' Я думаю, что могу вывести, что что-то не так с импортом ваших данных. Я предполагаю, что декодирование имеет объект dtype, а не список.

Пожалуйста, подтвердите , что переданный аргумент decode функции linestringdecode() имеет тип списка, а не строку.

0 голосов
/ 13 апреля 2020

Ответ был найден в этом разделе.

https://gis.stackexchange.com/questions/358068/converting-to-linestring-using-dataframe-column/

df['decode'] = df.decode.apply(lambda row: LineString(eval(row)))

Редактировать: eval () опасен для использования. Убедитесь, что вы используете надежные данные.

...