2017-10-06 4 views
1

Hej!Données du pays: renommer les pays selon dict dans pandas

Je travaille sur une analyse de données de statistiques nationales. J'utilise maintenant des données provenant de différentes sources et, comme on l'a vu, les pays sont parfois appelés différemment: alors que la Banque mondiale l'appelle «Royaume-Uni et Irlande du Nord», l'OMS pourrait l'appeler simplement «Royaume-Uni» construction politique (je suis conscient du fait que l'Angleterre, l'Ecosse et le Pays de Galles sont les "pays" pas vraiment le Royaume-Uni).

J'ai créé un dictionnaire où j'ai pris la plupart des différents noms pour le standardiser aux données de la Banque mondiale. Cela fonctionne comme un charme dans une liste, mais j'en ai besoin dans un DataFrame pandas, que je reçois de pd.read_csv. Dans l'exemple: Si j'ai un très court dictionnaire

dict = {'US': 'USA'} 

comment puis-je traduire dans mon dataframe (régler la colonne df.country à la valeur dict.key)?

Affichage en exemple:

ID country val 
1 US  some values 

à:

ID country val 
1 USA  some values 

Pour ma conversion de liste je la construction suivante, où listB est l'entrée et la liste de sortie:

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

Des suggestions comment le faire le plus facilement? Toute aide serait géniale! En outre, quelqu'un a-t-il une idée de comment générer des codes ISO 3166-1 alpha-3 (comme Allemagne = GER, Suède = SWE et ainsi de suite?). Cela pourrait être une extension de la question ci-dessus.

Répondre

2

Utilisation replace:

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

Et pour l'alpha-3 ISO 3166-1 contrôle answers.

Je pense que le plus simple est de le télécharger de here.

Si vous voulez analyser le code de wikipedia est possible utilisation this solution ou réécrite pour DataFrame dans 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 
+0

En attendant vous grattez la page wikipedia et convertir à 'dic' – Dark

+0

:) pas si facile; 0 – jezrael

+0

https://gis.stackexchange.com/questions/1047/full-list-of-iso-alpha-2-and-iso-alpha-3-country-codes pourrait aider – Dark