преобразование стран в континенты, когда в строке более одной страны

У меня есть столбец со страной, где в каждой строке указано более одной страны. Я хочу преобразовать каждую страну в континент. В прошлом я использовал конвертер стран, но когда я пытаюсь использовать его в этом случае, я получаю сообщение об ошибке, потому что в строке более одной страны.

Как я могу это исправить?

      !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)
Другие вопросы по тегам