Как добавить столбец в DataFrame Pandas, основанный на континенте, на котором находится страна

По сути, я хотел добавить столбец для всех 7 континентов, и я хочу, чтобы континенты были назначены в зависимости от того, где находится страна. Добавление столбца - это простая часть, все, что мне нужно сделать, это создать словарь и превратить его в столбец указанного Pandas DataFrame, сложная часть - заставить его назначить указанные континенты DataFrame, который я пытался найти в Интернете, но до сих пор Я не нашел никакого решения.

До сих пор я пытался найти другие решения, однако не смог найти ни одного, связанного с картографированием. Их казалось слишком утомительным, чтобы их печатать, поскольку мне пришлось бы вводить каждую страну в отдельности, чтобы карта континента работала. Пример: Как заменить название страны в столбцах данных на континент?

Кстати, вот файл, который я использовал для DataFrame: https://www.kaggle.com/datasets/deeplyft/world-population-growth-annual

Любая помощь будет оценена по достоинству, чтобы сделать ее менее утомительной.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
107
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сначала создайте словарь по всем странам, например. из https://statisticstimes.com:

df1 = pd.read_html('https://statisticstimes.com/geography/countries-by-continents.php')[2]
print (df1.head())
   No Country or Area ISO-alpha3 Code  M49 Code         Region 1 Region 2  \
0   1     Afghanistan             AFG         4    Southern Asia      NaN   
1   2   Åland Islands             ALA       248  Northern Europe      NaN   
2   3         Albania             ALB         8  Southern Europe      NaN   
3   4         Algeria             DZA        12  Northern Africa      NaN   
4   5  American Samoa             ASM        16        Polynesia      NaN   

  Continent  
0      Asia  
1    Europe  
2    Europe  
3    Africa  
4   Oceania 

#check continents
print (df1['Continent'].unique())
['Asia' 'Europe' 'Africa' 'Oceania' 'North America' 'Antarctica'
 'South America'] 

d = df1.set_index('Country or Area')['Continent'].to_dict()
# print (d)

Или из https://country-code.cl:

df1 = pd.read_html('https://country-code.cl/', encoding='iso-8859-1', skiprows=12)[1]
print (df1.head())
  Continent  Unnamed: 1            Name ISO 2 ISO 3 CIA Telephone Internet  \
0        AS         NaN     Afghanistan    AF   AFG  af        93      .af   
1        EU         NaN   Åland Islands    AX   ALA  fi    358 18      .ax   
2        EU         NaN         Albania    AL   ALB  al       355      .al   
3        AF         NaN         Algeria    DZ   DZA  ag       213      .dz   
4        OC         NaN  American Samoa    AS   ASM  aq     1 684      .as   

  Vehicle  
0     AFG  
1      AX  
2      AL  
3      DZ  
4     NaN 

di = {'AS':'Asia',
      'EU':'Europe',
      'AF':'Africa',
      'OC':'Oceania',
      'NA':'North America',
      'AN':'Antarctica',
      'SA':'South America'}

print (df1['Continent'].unique())
['AS' 'EU' 'AF' 'OC' nan 'AN' 'SA']

d = df1.set_index('Name')['Continent'].map(di).dropna().to_dict()
# print (d)

А затем отобразите столбец в вашем DataFrame, например:

df['continent'] = df['country'].map(d)
Ответ принят как подходящий

Я бы нанес на карту континенты по кодам стран. Этого легко достичь, используя существующие библиотеки Python, такие как pycountry-convert, которые зависят от надежных данных (из pkg-isocodes Debian).

Для этого вы можете сначала создать словарь для преобразования кодов ALPHA3 -> ALPHA2 -> CONTINENT_CODE -> CONTINENT_NAME.

# !pip install pycountry-convert

import pycountry
from pycountry_convert.convert_country_alpha2_to_continent_code import COUNTRY_ALPHA2_TO_CONTINENT_CODE
from pycountry_convert.convert_continent_code_to_continent_name import CONTINENT_CODE_TO_CONTINENT_NAME

alpha3_to_continent = {x.alpha_3: CONTINENT_CODE_TO_CONTINENT_NAME.get(
                         COUNTRY_ALPHA2_TO_CONTINENT_CODE.get(x.alpha_2)
                       ) for x in pycountry.countries}

df['continent'] = df['country_code'].map(alpha3_to_continent)
# move the column before the years for clarity (optional)
df.insert(2, 'continent', df.pop('continent'))

Выход:

                  country_name country_code      continent      1961      1962      1963      1964      1965      1966      1967      1968      1969      1970      1971      1972      1973      1974      1975      1976      1977      1978      1979      1980       1981       1982      1983      1984      1985      1986      1987      1988      1989      1990      1991       1992       1993      1994      1995      1996      1997      1998      1999      2000      2001      2002      2003      2004      2005      2006      2007      2008      2009      2010      2011      2012      2013      2014      2015      2016      2017      2018      2019      2020      2021      2022
0                        Aruba          ABW  North America  2.179059  1.548572  1.389337  1.215721  1.032841  0.862184  0.388847 -0.085719 -0.237372 -0.378264 -0.491852  0.066287  0.862804  1.110629  1.137966  0.784202  0.443510  0.443172  0.433153  0.420044   0.555730   0.798541  0.894335  0.768049  0.472594  0.116251 -0.159686 -0.183255  0.409531  1.712907  3.222415   3.372864   3.041932  3.196029  3.084061  3.025789  3.027359  3.004805  2.934413  2.539234  1.768757  1.194718  0.997396  0.900989  1.003077  1.181566  1.227711  1.241397  1.233231  1.131541  0.939356  0.810231  0.749301  0.691615  0.637959  0.590062  0.537296  0.494795  0.451970  0.134255 -0.045045 -0.086392
1  Africa Eastern and Southern          AFE            NaN  2.660180  2.732633  2.753248  2.806915  2.840787  2.813609  2.830505  2.881589  2.898532  2.911526  2.914856  2.870881  2.903938  2.986296  2.982409  2.969810  2.884096  3.012733  3.142594  2.965406   3.017564   3.130762  3.012801  2.939088  2.970293  3.022264  3.062817  2.919182  2.844888  2.911013  2.792410   2.633682   2.658526  2.619955  2.627107  2.693098  2.580384  2.514654  2.559662  2.583579  2.589961  2.606598  2.617764  2.644968  2.666242  2.702521  2.747109  2.765816  2.755745  2.757929  2.738185  2.740405  2.780207  2.774990  2.802586  2.728159  2.655672  2.688371  2.691134  2.678184  2.607472  2.543757
2                  Afghanistan          AFG           Asia  1.925952  2.014879  2.078997  2.139651  2.216007  2.253524  2.292638  2.347351  2.378917  2.433183  2.415369  2.429396  2.524421  2.513007  2.393287  2.179517  2.086951  1.963377  0.366493 -3.924172 -11.275324 -10.053006 -1.365708  2.894335  2.587697 -0.608561 -1.210190  0.586318  2.751877  0.202434  0.469880  11.522524  14.964455  9.864262  6.046536  4.103022  3.910605  3.882931  4.077879  1.443803  0.742517  6.449321  7.541019  3.933178  3.576508  4.139678  1.793196  2.002333  3.561288  2.894904  3.689508  4.077628  3.466788  3.657576  3.121341  2.581549  2.866492  2.885208  2.908529  3.134747  2.851358  2.534498
3   Africa Western and Central          AFW            NaN  2.115789  2.145723  2.190827  2.211360  2.242567  2.272816  2.275721  2.295953  2.323998  2.368198  2.397568  2.435340  2.511747  2.597047  2.683551  2.697073  2.735732  2.814038  2.850410  2.845011   2.849794   2.895500  2.720131  2.615809  2.705308  2.711539  2.713602  2.731061  2.766998  2.654931  2.628369   2.730421   2.671363  2.630610  2.693235  2.687499  2.689029  2.721941  2.706291  2.749600  2.799654  2.811453  2.816481  2.828642  2.841211  2.832780  2.828409  2.832916  2.844037  2.846536  2.848826  2.812851  2.761839  2.750731  2.723317  2.713059  2.706266  2.669239  2.633982  2.615646  2.573377  2.539799
4                       Angola          AGO         Africa  1.558355  1.460738  1.410425  1.301745  1.111041  0.875806  0.696698  0.695985  1.020355  1.694526  2.414339  2.993132  3.299374  3.352360  3.328324  3.274073  3.317449  3.398701  3.435448  3.503985   3.554422   3.592195  3.617137  3.609872  3.603751  3.565856  3.438674  3.367043  3.371351  3.345144  3.326137   3.248850   3.161547  3.198433  3.289676  3.330132  3.335154  3.279068  3.226448  3.244121  3.285217  3.335132  3.413321  3.506389  3.557659  3.592013  3.639589  3.670909  3.693482  3.734798  3.758796  3.758703  3.735525  3.684429  3.617678  3.586211  3.550987  3.464457  3.395278  3.268348  3.166030  3.096753

Однако ваш набор данных включает не только страны, но и неофициальные регионы, такие как «Западная и Центральная Африка» или «Западная и Центральная Африка», для которых вы можете извлечь название континента из строки:

import re

pat = '(%s)' % '|'.join(map(re.escape, CONTINENT_CODE_TO_CONTINENT_NAME.values()))
# '(Asia|Europe|North\\ America|South\\ America|Africa|Oceania|Antarctica)'

m = df['continent'].isna()
df.loc[m, 'continent'] = df.loc[m, 'country_name'].str.extract(pat, expand=False)

Выход:

                 country_name country_code      continent      1961      1962      1963      1964      1965      1966      1967      1968      1969      1970      1971      1972      1973      1974      1975      1976      1977      1978      1979      1980       1981       1982      1983      1984      1985      1986      1987      1988      1989      1990      1991       1992       1993      1994      1995      1996      1997      1998      1999      2000      2001      2002      2003      2004      2005      2006      2007      2008      2009      2010      2011      2012      2013      2014      2015      2016      2017      2018      2019      2020      2021      2022
0                        Aruba          ABW  North America  2.179059  1.548572  1.389337  1.215721  1.032841  0.862184  0.388847 -0.085719 -0.237372 -0.378264 -0.491852  0.066287  0.862804  1.110629  1.137966  0.784202  0.443510  0.443172  0.433153  0.420044   0.555730   0.798541  0.894335  0.768049  0.472594  0.116251 -0.159686 -0.183255  0.409531  1.712907  3.222415   3.372864   3.041932  3.196029  3.084061  3.025789  3.027359  3.004805  2.934413  2.539234  1.768757  1.194718  0.997396  0.900989  1.003077  1.181566  1.227711  1.241397  1.233231  1.131541  0.939356  0.810231  0.749301  0.691615  0.637959  0.590062  0.537296  0.494795  0.451970  0.134255 -0.045045 -0.086392
1  Africa Eastern and Southern          AFE         Africa  2.660180  2.732633  2.753248  2.806915  2.840787  2.813609  2.830505  2.881589  2.898532  2.911526  2.914856  2.870881  2.903938  2.986296  2.982409  2.969810  2.884096  3.012733  3.142594  2.965406   3.017564   3.130762  3.012801  2.939088  2.970293  3.022264  3.062817  2.919182  2.844888  2.911013  2.792410   2.633682   2.658526  2.619955  2.627107  2.693098  2.580384  2.514654  2.559662  2.583579  2.589961  2.606598  2.617764  2.644968  2.666242  2.702521  2.747109  2.765816  2.755745  2.757929  2.738185  2.740405  2.780207  2.774990  2.802586  2.728159  2.655672  2.688371  2.691134  2.678184  2.607472  2.543757
2                  Afghanistan          AFG           Asia  1.925952  2.014879  2.078997  2.139651  2.216007  2.253524  2.292638  2.347351  2.378917  2.433183  2.415369  2.429396  2.524421  2.513007  2.393287  2.179517  2.086951  1.963377  0.366493 -3.924172 -11.275324 -10.053006 -1.365708  2.894335  2.587697 -0.608561 -1.210190  0.586318  2.751877  0.202434  0.469880  11.522524  14.964455  9.864262  6.046536  4.103022  3.910605  3.882931  4.077879  1.443803  0.742517  6.449321  7.541019  3.933178  3.576508  4.139678  1.793196  2.002333  3.561288  2.894904  3.689508  4.077628  3.466788  3.657576  3.121341  2.581549  2.866492  2.885208  2.908529  3.134747  2.851358  2.534498
3   Africa Western and Central          AFW         Africa  2.115789  2.145723  2.190827  2.211360  2.242567  2.272816  2.275721  2.295953  2.323998  2.368198  2.397568  2.435340  2.511747  2.597047  2.683551  2.697073  2.735732  2.814038  2.850410  2.845011   2.849794   2.895500  2.720131  2.615809  2.705308  2.711539  2.713602  2.731061  2.766998  2.654931  2.628369   2.730421   2.671363  2.630610  2.693235  2.687499  2.689029  2.721941  2.706291  2.749600  2.799654  2.811453  2.816481  2.828642  2.841211  2.832780  2.828409  2.832916  2.844037  2.846536  2.848826  2.812851  2.761839  2.750731  2.723317  2.713059  2.706266  2.669239  2.633982  2.615646  2.573377  2.539799
4                       Angola          AGO         Africa  1.558355  1.460738  1.410425  1.301745  1.111041  0.875806  0.696698  0.695985  1.020355  1.694526  2.414339  2.993132  3.299374  3.352360  3.328324  3.274073  3.317449  3.398701  3.435448  3.503985   3.554422   3.592195  3.617137  3.609872  3.603751  3.565856  3.438674  3.367043  3.371351  3.345144  3.326137   3.248850   3.161547  3.198433  3.289676  3.330132  3.335154  3.279068  3.226448  3.244121  3.285217  3.335132  3.413321  3.506389  3.557659  3.592013  3.639589  3.670909  3.693482  3.734798  3.758796  3.758703  3.735525  3.684429  3.617678  3.586211  3.550987  3.464457  3.395278  3.268348  3.166030  3.096753

Это все еще оставляет некоторые записи неназначенными:

print(df.loc[df['continent'].isna(), 'country_name'].tolist())

['Channel Islands', 'Caribbean small states', 'Early-demographic dividend', 'Euro area', 'IBRD only', 'IDA & IBRD total', 'IDA total', 'IDA blend', 'IDA only', 'Latin America & Caribbean (excluding high income)', 'Low & middle income', 'Late-demographic dividend', 'Pre-demographic dividend', 'Post-demographic dividend', 'Sint Maarten (Dutch part)', 'Latin America & the Caribbean (IDA & IBRD countries)', 'Timor-Leste', 'Kosovo', 'World', 'Small states', 'Pacific island small states', 'Other small states', 'OECD members', 'Least developed countries: UN classification', 'Latin America & Caribbean', 'Heavily indebted poor countries (HIPC)', 'Fragile and conflict affected situations', 'Arab World', 'Upper middle income', 'Middle income', 'Lower middle income', 'Low income', 'High income']

Некоторые из них могут быть вручную присвоены континенту («Нормандские острова» -> «Европа»), другие могут быть неоднозначными («Мир») или не относиться к географическому региону («Другие малые государства», «Поздний демографический дивиденд»). .

Для этого вы можете добавить последний шаг с помощью специального картографа:

custom = {'Channel Islands': 'Europe'}
m = df['continent'].isna()
df.loc[m, 'continent'] = df.loc[m, 'country_name'].map(custom)

Другие вопросы по теме