#python #python-3.x #geopandas
#python #python-3.x #панды #геопанды #география
Вопрос:
Я пытаюсь отобразить данные на континентах с помощью геопанды.
У меня есть следующее количество заявок из моей сводной таблицы по количеству зарегистрированных заявок из каждой страны:
Number of Tickets
region
Africa 370
Americas 1130
Asia 873
Europe 671
Oceania 445
В моем фрейме данных списка заявок у меня есть зарегистрированные случаи из каждой страны. Каждая страна сопоставляется с регионом и континентом. Следуя логике, каждому зарегистрированному тикету присваивается страна, регион и континент.
Чтобы иметь возможность отображать данные, я объединяю фрейм данных Geopandas (геометрия страны) с фреймом данных моего билета с 3-буквенными кодами стран и удостоверяюсь, что результирующий фрейм данных является фреймом геоданных:
tickets_region = pd.merge(world, tickets, left_on='ISO_A3', right_on='code-3')
type(tickets_region)
geopandas.geodataframe.GeoDataFrame
Я пытаюсь отобразить данные с помощью следующего кода:
fig, ax = plt.subplots()
ax = tickets_region.plot('continent', cmap='Reds',scheme='headtailbreaks')
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.title('Number of Tickets by Continent')
plt.box(False)
plt.show()
Однако этот блок кода никогда не заканчивается, потребляет память и циклы процессора, и мне приходится нажимать Ctrl-C, чтобы вырезать его. Тот же код работает с ‘code-3’ (3-буквенные коды стран.)
Я предполагаю, что это связано с географией «континента», не определенной в файле geojson, но я ожидаю, что она будет заполнена Python путем суммирования количества билетов. Я вижу, что в моем ожидании где-то нарушена логика, но я не могу этого увидеть.
Есть идеи о том, как я могу заставить работать график континента?
Спасибо.
Редактировать: фрейм данных «world» — это файл geojson, загружаемый с https://datahub.io/core/geo-countries
Ответ №1:
Вы можете использовать метод dissolve()
из фрейма данных GeoPandas. Вы можете ознакомиться с документацией GeoPandas здесь. Ваш код может быть изменен следующим образом :
tickets_region = tickets_region.dissolve(by='continent', aggfunc='sum')
fig, ax = plt.subplots()
ax = tickets_region.plot(column='Number of Tickets', cmap='Reds',scheme='headtailbreaks')
ax.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False)
plt.title('Number of Tickets by Continent')
plt.box(False)
plt.show()
Комментарии:
1. Извините за последний ответ Пьера-Лоика. Я тестирую растворение, как вы упомянули, но это не оказывает никакого влияния на 20 тыс. строк: IPython просто перестает отвечать на запросы. Я все еще работаю над вашим ответом — и появится, когда у меня будет решение.
2. большое спасибо, и да, это решение. Я просто хотел бы отметить, что использование .dissolve не заканчивается при запуске с тысячами строк. Я бы предложил сначала перейти к обобщению данных (pivot_table, pivot …), А затем использовать .dissolve. В противном случае это занимает много циклов процессора и потребляет много памяти.
Ответ №2:
Недавно я использовал этот поток для проведения анализа. В данных не хватало координат континентов для построения графика, поэтому возникла идея импортировать существующий набор данных и объединить их вместе. Вот импорт и dissolve
код:
import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path("naturalearth_lowres")).drop(['gdp_md_est'], axis=1)
world = world.dissolve(by='continent', aggfunc='sum')
world = world.merge(d, how='inner', left_on='continent', right_index=True)
Записная книжка Kaggle доступна по адресу https://www.kaggle.com/code/pavfedotov/gtc-map