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