У меня есть один фрейм данных, полученный в результате пространственного соединения двух объектов Geopandas.GeoDataFrame.
Поскольку было более одного элемента, перекрывающегося с целевым объектом, строки были продублированы, так что каждая строка имеет унаследованную информацию от каждого из перекрывающихся объектов.Чтобы смоделировать эту ситуацию, мы можем запустить следующие строки:
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
cities = geopandas.read_file(geopandas.datasets.get_path('naturalearth_cities'))
cities = cities[['geometry', 'name']]
cities = cities.rename(columns={'name':'City'})
countries_with_city = geopandas.sjoin(world, cities, how="inner", op='intersects')
Я пытаюсь сгенерировать новый столбец в мировом геофрейме, который содержит список длиной 0,1 или +1, с "City"
атрибут всех перекрывающихся городов каждой страны.Для этого я написал следующее:
for country in world.index:
subset_countries = countries_with_city.loc[countries_with_city.index==world.loc[country, "name"]]
a = subset_countries["City"].tolist()
list_of_names = list(subset_countries["City"])
world[list_of_names]=list_of_names
Однако, когда я запускаю этот код, я застреваю в строке a = subset_countries["City"].tolist()
.Я получаю ошибку 'str' object has no attribute 'tolist'
.
Согласно тому, что я проверил и исследовал, похоже, что я получаю эту ошибку, потому что в первой стране [countries_with_city.loc[countries_with_city.index==world.loc[1, "name"]]
] есть только один город.Следовательно, когда я срезаю фрейм данных, то факт, что есть только одна строка с индексом = 1, делает результат строкой, а не фреймом данных, который затем может быть указан в списке.
Есть ли прямой способ, которым я могу использовать, чтобы код работал в любом случае?(когда есть 0, 1 и много городов).Цель состоит в том, чтобы создать список названий городов, которые затем будут записаны в мировом фрейме данных.
Я работаю над Python 3