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等等?)。这可能是上述问题的延伸。
答案 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