7 и MySQL 8.0
Моя цель - запросить тип данных многоугольника из mysql с использованием py mysql и преобразовать его в тип данных многоугольника в python.
Это то, что мой запрос MySQL выглядит так:
select name
, ST_AsText(polygon) as polygon
, ST_AsText(new_polygon) as new_polygon
FROM table;
который выводит:
location polygon new_polygon
0 A POLYGON ((127.046 37.431,...)) POLYGON ((127.094 37.41,...))
1 B POLYGON ((127.046 37.491,...)) POLYGON ((127.044 37.41,...))
2 C POLYGON ((127.094 37.91,...)) POLYGON ((127.04694 37.48391,...))
3 D POLYGON ((127.94 37.1,...)) None
Используя py mysql Я запускаю запрос mysql и превращаю его в фрейм данных, который выглядит как один выше. Затем я пытаюсь изменить столбец polygon, new_polygon, который находится в строковом формате, на тип данных polygon, чтобы я мог сопоставить с использованием библиотеки визуализации.
df= pd.read_sql(q, con=conn)
df["polygon"] = df["polygon"].apply(wkt.loads)
df["new_polygon"] = df["new_polygon"].apply(wkt.loads)
последняя строка - проблема. так как у меня None в последней строке, он дает мне AttributeError: 'NoneType' object has no attribute 'encode'
Итак, я пробовал
df["new_polygon"].iloc[:-1] = df["new_polygon"].iloc[:-1].apply(wkt.loads)
, который выводит SettingWithCopyWarning
только в первый раз, когда я подключаюсь к py mysql и запускаю запрос и операции с фреймом данных. Если я снова запустил
, последняя строка SettingWithCopyWarning
не появится. Я добавил .copy () в конце, это снова то же самое, при первом запуске кода выводится предупреждение, но при повторном запуске предупреждения не отображается.
Перед публикацией этой проблемы я создал MRE:
df = pd.DataFrame({
"location": ["A","B","C","D"],
"polygon": ["POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
"POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
"POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
"POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))"],
"new_polygon":["POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
"POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
"POLYGON((127.04694 37.48391,127.06455 37.49144,127.07445 37.49465,127.04694 37.48391))",
None]
})
df["polygon"] = df["polygon"].apply(wkt.loads)
df["new_polygon"].iloc[:-1] = df["new_polygon"].iloc[:-1].apply(wkt.loads)
это работает без SettingWithCopyWarning
Я хочу знать, почему он выдает предупреждение в моем исходном запросе и коде. Кроме того, если есть лучший способ, то используйте .iloc [: - 1] для игнорирования последней строки, пожалуйста, сообщите.