Данные о стране: переименование стран в соответствии с dict в пандах

Эй!

Я работаю над анализом некоторых данных статистики страны. Теперь я использую данные из разных источников, и, как только я заметил, страны иногда называют по-разному: в то время как Всемирный банк называет это «Соединенное Королевство и Северная Ирландия», ВОЗ может назвать это просто «Соединенное Королевство» и иметь в виду то же самое. политическая конструкция (я осведомлен о том, что Англия, Шотландия и Уэльс являются «странами», а не Великобританией).

Я создал словарь, в котором взял большинство различных имен, чтобы стандартизировать его для данных Всемирного банка. Это работает как шарм в списке, но мне он нужен в фрейме данных pandas, который я получаю от pd.read_csv. Например: если у меня очень короткий словарь

dict = {'US': 'USA'}

как я могу перевести это в свой фрейм данных (установить столбец в df.country на значение dict.key)?

Показываем это в примере:

ID  country   val
1   US        some values

to:

ID  country  val
1   USA      some values

Для преобразования списка я использовал следующую конструкцию, где listB - это список ввода и вывода:

for key in dict:
    listB = [w.replace(key, dict[key]) for w in listB]

Есть предложения, как это сделать проще всего? Любая помощь была бы потрясающей!

P.S: Кстати, есть ли у кого-нибудь идеи, как сгенерировать коды ISO 3166-1 alpha-3 (например, Германия = Германия, Швеция = SWE и т. Д.?). Это может быть продолжением вопроса выше.


person Maethor    schedule 06.10.2017    source источник


Ответы (2)


Используйте replace:

df['country'] = df['country'].replace(dic)

А для ISO 3166-1 alpha-3 проверьте ответы.

Я думаю, что проще всего загрузить его с здесь.

Если вы хотите проанализировать код из wikipedia, можно использовать это решение или переписать для DataFrame в python 3:

from bs4 import BeautifulSoup
import requests

url = "http://en.wikipedia.org/wiki/ISO_3166-1"
r = requests.get(url)
soup = BeautifulSoup(r.content, "lxml")

t = soup.findAll('table', {'class' : 'wikitable sortable'})[1]
L = []
cs = [th.findAll(text=True)[0] for th in t.findAll('th')]

for row in t.findAll("tr")[1:]:
    tds = row.findAll('td')
    raw_cols = [td.findAll(text=True) for td in tds]
    cols = []
    # country field contains differing numbers of elements, due to the flag -- 
    # only take the name
    cols.append(raw_cols[0][-1:][0])
    # for all other columns, use the first result text
    cols.extend([col[0] for col in raw_cols[1:]])
    L.append(cols)

df = pd.DataFrame(L, columns=cs)

print (df.head())
  English short name (upper/lower case) Alpha-2 code Alpha-3 code  \
0                           Afghanistan           AF          AFG   
1                         Åland Islands           AX          ALA   
2                               Albania           AL          ALB   
3                               Algeria           DZ          DZA   
4                        American Samoa           AS          ASM   

  Numeric code       Link to  Independent  
0          004  ISO 3166-2:AF         Yes  
1          248  ISO 3166-2:AX          No  
2          008  ISO 3166-2:AL         Yes  
3          012  ISO 3166-2:DZ         Yes  
4          016  ISO 3166-2:AS          No  
person jezrael    schedule 06.10.2017
comment
Жду, когда вы очистите страницу Википедии и конвертируете ее в dic - person Bharath; 06.10.2017
comment
:) не все так просто; 0 - person jezrael; 06.10.2017
comment
gis.stackexchange.com/questions/1047/ могут помочь - person Bharath; 06.10.2017
comment
Да, черт возьми, я тупой идиот ... почему-то я решил, что мне нужно вручную перебирать весь список с помощью цикла ... - person Maethor; 06.10.2017

Вы можете использовать функцию clean_country() из библиотеки DataPrep для преобразования столбца названий стран в коды ISO 3166-1 alpha-3. Установите DataPrep с pip install dataprep.

from dataprep.clean import clean_country
df = pd.DataFrame({"country": ["Germany", "Sweden", "US"]})

df2 = clean_country(df, "country", output_format="alpha-3")
df2
   country country_clean
0  Germany           DEU
1   Sweden           SWE
2       US           USA
person victoria55    schedule 23.02.2021