如何正确将字典值匹配至DataFrame的Continent新列?
问题:DataFrame通过字典匹配生成大洲列失败
我有如下DataFrame:
Country Population Continent 0 China 1.367645e+09 South America 1 United States 3.176154e+08 South America 2 Japan 1.274094e+08 South America 3 United Kingdom 6.387097e+07 South America 4 Russian Federation 1.435000e+08 South America 5 Canada 3.523986e+07 South America 6 Germany 8.036970e+07 South America 7 India 1.276731e+09 South America 8 France 6.383735e+07 South America 9 South Korea 4.980543e+07 South America 10 Italy 5.990826e+07 South America 11 Spain 4.644340e+07 South America 12 Iran 7.707563e+07 South America 13 Australia 2.331602e+07 South America 14 Brazil 2.059153e+08 South America
以及用于匹配的字典:
ContinentDict = {'China':'Asia', 'United States':'North America', 'Japan':'Asia', 'United Kingdom':'Europe', 'Russian Federation':'Europe', 'Canada':'North America', 'Germany':'Europe', 'India':'Asia', 'France':'Europe', 'South Korea':'Asia', 'Italy':'Europe', 'Spain':'Europe', 'Iran':'Asia', 'Australia':'Australia', 'Brazil':'South America'}
我想通过匹配Country列和字典的键,生成正确的Continent列,尝试了以下代码:
for country in df['Country']: df['Continent'] = ContinentDict[country]
但结果整列都被填充为South America,无法得到每个国家对应的正确大洲值。
解决方法
问题原因
你写的循环逻辑存在错误:每次循环都会把整个Continent列赋值为当前国家对应的大洲,循环到最后一个国家(Brazil)时,整列就都被覆盖成它对应的South America,前面的所有赋值操作都无效了。
正确实现方式
Pandas提供了高效的map()方法,专门用于这种列与字典的映射匹配,无需手动编写循环:
df['Continent'] = df['Country'].map(ContinentDict)
执行后,Continent列会自动根据每个国家匹配字典中的对应值,得到正确结果:
Country Population Continent 0 China 1.367645e+09 Asia 1 United States 3.176154e+08 North America 2 Japan 1.274094e+08 Asia 3 United Kingdom 6.387097e+07 Europe 4 Russian Federation 1.435000e+08 Europe 5 Canada 3.523986e+07 North America 6 Germany 8.036970e+07 Europe 7 India 1.276731e+09 Asia 8 France 6.383735e+07 Europe 9 South Korea 4.980543e+07 Asia 10 Italy 5.990826e+07 Europe 11 Spain 4.644340e+07 Europe 12 Iran 7.707563e+07 Asia 13 Australia 2.331602e+07 Australia 14 Brazil 2.059153e+08 South America
补充说明
如果担心存在字典中没有的国家导致报错,可以添加na_action='ignore'参数忽略匹配失败的行:
df['Continent'] = df['Country'].map(ContinentDict, na_action='ignore')
内容的提问来源于stack exchange,提问作者Vicente Parra
相关产品推荐
相关产品推荐

