преобразование стран в континенты, когда в строке более одной страны
У меня есть столбец со страной, где в каждой строке указано более одной страны. Я хочу преобразовать каждую страну в континент. В прошлом я использовал конвертер стран, но когда я пытаюсь использовать его в этом случае, я получаю сообщение об ошибке, потому что в строке более одной страны.
Как я могу это исправить?
!pip install country_converter --upgrade
import pandas as pd
import country_converter as coco
import pycountry_convert as pc
df = pd.DataFrame()
df['country']=['United States, Canada, England', 'United Kingdom, Spain, South Korea', 'Spain', 'France, Sweden']
# CONVERT COUNTRY TO ISO COUNTRY
cc = coco.CountryConverter()
# Create a list of country names for the dataframe
country = []
for name in df['country']:
country.append(name)
# Converting country names to ISO 3
iso_alpha = cc.convert(names = country, to='ISO3')
# CONVERT ISO COUNTRY TO CONTENENT
def country_to_continent(country_name):
country_alpha2 = pc.country_name_to_country_alpha2(country_name)
country_continent_code = pc.country_alpha2_to_continent_code(country_alpha2)
country_continent_name = pc.convert_continent_code_to_continent_name(country_continent_code)
return country_continent_name
# converting to contenents
contenent=[]
for iso in iso_alpha:
try:
country_name = iso
contenent.append(country_to_continent(country_name))
except:
contenent.append('other')
# add contenents to original dataframe
df['Contenent']=contenent
2 ответа
Предполагая, что я вас правильно понял, вы хотите вернуть результат в DataFrame. Поэтому в каждой строке будет несколько континентов, соответствующих соответствующей стране.
Если это так, вам нужно разделить каждую строку, а затем разделить строку, чтобы каждую страну можно было обрабатывать отдельно, а затем соединить обратно строку за строкой, прежде чем возвращать в DataFrame.
Несколько замечаний:
- «Англия» не является страной, поэтому будет помечена как «другая». Если вы используете IDE, в окне выполнения появится предупреждение. Я не пытался это исправить.
- Преобразователь CountryConverter вернет строку, если он получил только одну страну, поэтому необходимо проверить тип возвращаемого значения.
- Я переместил «def» вверх, поэтому основной код находится внизу.
Вот код, который работает для меня:
import pandas as pd
import country_converter as coco
import pycountry_convert as pc
# CONVERT ISO COUNTRY TO CONTENENT
def country_to_continent(country_name):
country_alpha2 = pc.country_name_to_country_alpha2(country_name)
country_continent_code = pc.country_alpha2_to_continent_code(country_alpha2)
country_continent_name = pc.convert_continent_code_to_continent_name(country_continent_code)
return country_continent_name
# ------ MAIN -------
df = pd.DataFrame()
df['country']=['United States, Canada, England', 'United Kingdom, Spain, South Korea', 'Spain', 'France, Sweden']
# CONVERT COUNTRY TO ISO COUNTRY
cc = coco.CountryConverter()
# Create a list of country names for the dataframe
cont_list=[]
for arow in df['country']:
country = []
arowarr = arow.split(", ")
for aname in arowarr:
country.append(aname)
#print(f'org:{arow} split:{country}')
# Converting country names to ISO 3
iso_alpha = cc.convert(names = country, to='ISO3')
#print(f'iso_alpha:{iso_alpha} type:{type(iso_alpha)}')
# converting to contenents
contenent=[]
if (type(iso_alpha) == type("")):
try:
#print(f' iso_alpha:{iso_alpha}')
contenent.append(country_to_continent(iso_alpha))
except:
contenent.append('other')
else:
for iso in iso_alpha:
try:
#print(f' iso:{iso}')
contenent.append(country_to_continent(iso))
except:
contenent.append('other')
# convert array back to string
str_cont = ', '.join(contenent)
#print(f'str_cont:{str_cont}')
cont_list.append(str_cont)
# add contenents to original dataframe
df['Contenent']=cont_list
print(f"DF Contenent: \n{df['Contenent']}")
С помощью @Ignatius Reilly я смог это понять.
Я все еще изучаю Python, поэтому мне было легко понять сначала разбиение строки. Поскольку все страны были разделены запятыми, это работало без осложнений.
country_split=[]
for x in df['country']:
country_split.append(x.split(','))
Затем я понял, что могу изменить cc.convert с «ISO3» на «Continent», чтобы действительно упростить код.
выходные данные содержали повторяющиеся континенты, например [Америка, Америка]. Так что я использовал.map(pd.unique)
чтобы удалить повторяющиеся значения.
окончательный код:
!pip install country_converter --upgrade
import pandas as pd
import country_converter as coco
df = pd.DataFrame()
df['country']=['United States, Canada', 'United Kingdom, Spain, South Korea', 'Spain', 'France, Sweden']
# Create a list of country names from the dataframe
country_split=[]
for x in df['country']:
country_split.append(x.split(','))
# Converting country names to contenent
cc = coco.CountryConverter()
iso_alpha_list = [cc.convert(names=name, to='Continent') for name in country_split]
df['continent_split']= iso_alpha_list
df['continent']=df['continent_split'].map(pd.unique)