По сути, я хотел добавить столбец для всех 7 континентов, и я хочу, чтобы континенты были назначены в зависимости от того, где находится страна. Добавление столбца - это простая часть, все, что мне нужно сделать, это создать словарь и превратить его в столбец указанного Pandas DataFrame, сложная часть - заставить его назначить указанные континенты DataFrame, который я пытался найти в Интернете, но до сих пор Я не нашел никакого решения.
До сих пор я пытался найти другие решения, однако не смог найти ни одного, связанного с картографированием. Их казалось слишком утомительным, чтобы их печатать, поскольку мне пришлось бы вводить каждую страну в отдельности, чтобы карта континента работала. Пример: Как заменить название страны в столбцах данных на континент?
Кстати, вот файл, который я использовал для DataFrame: https://www.kaggle.com/datasets/deeplyft/world-population-growth-annual
Любая помощь будет оценена по достоинству, чтобы сделать ее менее утомительной.
Сначала создайте словарь по всем странам, например. из 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)