Python 通过比较不同数据帧中的两个其他列来创建新的数据帧列

Python 通过比较不同数据帧中的两个其他列来创建新的数据帧列,python,pandas,Python,Pandas,我有一个数据框,其中包含Alpha 2国家代码(英国、ES、SL等),我需要这些国家名称。我创建了第二个数据框,其中一列包含所有Alpha 2国家代码,另一列包含相应的名称 我尝试比较这两列,然后使用索引创建新列。然而,我很难在不使用循环的情况下做到这一点。我觉得有一种更有效的方法来避免循环 我尝试过使用for循环,迭代: cube_data = pd.DataFrame({'Country Code':['UK','ES','SL']}) alpha2 = pd.DataFrame({'Cod

我有一个
数据框
,其中包含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循环遍历列,当在
alpha2['code']
中找到来自
cube\u数据的代码时,索引用于创建一个新的序列,该序列在与cube\u数据对应的正确位置具有
alpha['Name']

最终结果是:

cube_data
  Country Code    Name
0   UK  United Kingdom
1   ES           Spain
2   SL    Sierra Leone
当然有更好的方法来避免循环?我已经看过
series.isin()
series.map()
了,但是它们似乎没有提供我需要的结果


这可以在没有循环的情况下完成吗?

在将
alpha2
转换为可映射对象后使用
map

首先,我们制作地图:

>> 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'}
然后我们将其映射到
国家代码
列:

>> 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
您可以使用熊猫:

merge
的工作原理类似于SQL连接:这里我们将
alpha2
cube\u数据合并。我们使用
alpha2
中的
'code'
列和
cube\u data
中的
'Country code'
列将两个数据框合并在一起,并使用
'internal'
连接
逻辑意味着只保留两个数据框中存在的值。最后,我们将
alpha2
中删除
'code'
,该列包含与
'Country code'

列相同的值。您查看了该列了吗

我已将您的“UK”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
  Country Code            name
0           GB  United Kingdom
1           ES           Spain
2           SL    Sierra Leone