形状循环不创建线串
Shapely loop not creating Linestring
我正在尝试将元组从数据帧转换为线串。这是我从 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
我最终想循环它,所以我将它设置为数据帧列解码。这是我为最终将线串写入列而创建的循环。
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)
我该如何编写才能避免此错误并将元组转换为我的数据框中的列?
编辑最终解决方案
经过一些清理后发现列 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)
备选方案 解决此问题的另一种选择是已经修复导入。通过在 ast.literal_eval
的帮助下直接将字符串直接转换为元组列表,如 SO Question
中所建议
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 对象而不是列表。
请验证 传递给函数 linestringdecode()
的参数 decode
是输入列表而不是字符串。
答案已在本节中找到。
https://gis.stackexchange.com/questions/358068/converting-to-linestring-using-dataframe-column/
df['decode'] = df.decode.apply(lambda row: LineString(eval(row)))
编辑:eval() 使用起来很危险。确保您使用的是可信数据。
我正在尝试将元组从数据帧转换为线串。这是我从 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
我最终想循环它,所以我将它设置为数据帧列解码。这是我为最终将线串写入列而创建的循环。
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)
我该如何编写才能避免此错误并将元组转换为我的数据框中的列?
编辑最终解决方案
经过一些清理后发现列 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)
备选方案 解决此问题的另一种选择是已经修复导入。通过在 ast.literal_eval
的帮助下直接将字符串直接转换为元组列表,如 SO Question
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 对象而不是列表。
请验证 传递给函数 linestringdecode()
的参数 decode
是输入列表而不是字符串。
答案已在本节中找到。
https://gis.stackexchange.com/questions/358068/converting-to-linestring-using-dataframe-column/
df['decode'] = df.decode.apply(lambda row: LineString(eval(row)))
编辑:eval() 使用起来很危险。确保您使用的是可信数据。