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

时间:2019-01-15 10:47:37

标签: python pandas

我有一个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(),但这些似乎无法提供我需要的结果。

这可以不循环吗?

3 个答案:

答案 0 :(得分:1)

您可以使用熊猫merge

df = alpha2.merge(cube_data, left_on='Code', right_on='Country Code', how='inner').drop('Code', axis=1)

merge的工作方式类似于SQL连接:在这里,我们将alpha2cube_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