国家/地区数据:根据大熊猫的dict重命名国家/地区

时间:2017-10-06 11:58:42

标签: python pandas dataframe naming

HeJ小鼠!

我正在进行国家统计数据的一些数据分析。我现在使用来自不同来源的数据,并且很快就会看到,各国有时会被称为不同的国家:当世界银行称之为“英国和北爱尔兰”时,世界卫生组织可能会简单地将其称为“#34”。 ;英国"并且意味着相同的政治结构(我知道英格兰,苏格兰和威尔士是"国家"不是真正的英国)。

我创建了一个字典,其中我使用了大部分不同的名称来将其标准化为世界银行数据。这就像列表中的魅力一样,但我需要它来自pandas DataFrame,我从pd.read_csv获得。 例如:如果我有一个非常短的字典

dict = {'US': 'USA'}

如何在我的数据框中对此进行翻译(将df.country中的列设置为dict.key值?)

在示例中显示:

ID  country   val
1   US        some values

为:

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代码(如德国= GER,瑞典= SWE等等?)。这可能是上述问题的延伸。

2 个答案:

答案 0 :(得分:2)

使用replace

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

对于ISO 3166-1 alpha-3,请检查answers

我认为最简单的是从here下载。

如果需要来自wikipedia的解析代码,请使用this解决方案,或在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  

答案 1 :(得分:0)

您可以使用库 clean_country() 中的函数 DataPrep 将一列国家/地区名称转换为 ISO 3166-1 alpha-3 代码。使用 pip install dataprep 安装 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