измените строку на многоугольник, когда последняя строка - None, используя MySQL и Python - PullRequest
0 голосов
/ 26 мая 2020

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] для игнорирования последней строки, пожалуйста, сообщите.

...