我有一个DataFrame
,其中包含Alpha 2国家/地区代码(英国,ES,SL等),我需要将其用作国家/地区名称。我创建了第二个数据框,其中一列包含所有Alpha 2国家/地区代码,而另一列具有相应的名称。
我正在尝试比较这两列,然后使用索引来创建新列。但是我在不使用循环的情况下努力做到这一点。我觉得有一种更有效的方法可以做到这一点而无需循环?
我尝试使用for循环,遍历:
cube_data = pd.DataFrame({'Country Code':['UK','ES','SL']})
alpha2 = pd.DataFrame({'Code':['ES','GH','UK','SL'],
'Name':['Spain','Ghana','United Kingdom','Sierra Leone']})
cube_data
Country Code
0 UK
1 ES
2 SL
alpha2
Code Name
0 ES Spain
1 GH Ghana
2 UK United Kingdom
3 SL Sierra Leone
我使用了for循环来遍历各列,当在cube_data
中找到alpha2['Code']
的代码时,该索引用于创建一个新序列,该序列在alpha['Name']
与cube_data对应的正确位置。
最终结果是:
cube_data
Country Code Name
0 UK United Kingdom
1 ES Spain
2 SL Sierra Leone
当然有更好的方法可以不循环吗?我看过series.isin()
和series.map()
,但这些似乎无法提供我需要的结果。
这可以不循环吗?
答案 0 :(得分:1)
您可以使用熊猫merge
:
df = alpha2.merge(cube_data, left_on='Code', right_on='Country Code', how='inner').drop('Code', axis=1)
merge
的工作方式类似于SQL连接:在这里,我们将alpha2
与cube_data
合并。我们使用'Code'
的{{1}}列和alpha2
的{{1}}列将两个datframe合并在一起,并使用'Country Code'
cube_data
逻辑,这意味着两个数据帧中存在的值将被保留。最后,我们'inner'
的{{1}}列join
包含与列drop
答案 1 :(得分:0)
将map
转换为可映射对象后,请使用alpha2
。
首先,我们制作地图:
>> country_map = alpha2.set_index('Code')['Name'].to_dict()
>> # country_map = dict(alpha2[['Code', 'Name']].values)
>> # country_map = alpha2.set_index('Code')['Name']
>> print(country_map)
{'ES': 'Spain', 'UK': 'United Kingdom', 'GH': 'Ghana', 'SL': 'Sierra Leone'}
然后我们将其映射到Country Code
列:
>> cube_data['Country'] = cube_data['Country Code'].map(country_map)
>> print(cube_data)
Country Code Country
0 UK United Kingdom
1 ES Spain
2 SL Sierra Leone
答案 2 :(得分:0)
您是否看过pycountry module?
我已将您的“英国” alpha_2更改为“ GB”。
import pandas as pd
import pycountry
cube_data = pd.DataFrame({'Country Code':['GB','ES','SL']})
for alpha2_code in cube_data['Country Code']:
c = pycountry.countries.get(alpha_2=alpha2_code)
print(c.name)
输出:
United Kingdom
Spain
Sierra Leone
使用lambda创建新列
df = cube_data
df['Name'] = df['Country Code'].apply(lambda x: pycountry.countries.get(alpha_2=x).name)
print(df)
输出:
Country Code name
0 GB United Kingdom
1 ES Spain
2 SL Sierra Leone