【问题标题】:Create a new dataframe column by comparing two other columns in different dataframes [duplicate]通过比较不同数据框中的其他两列来创建一个新的数据框列[重复]
【发布时间】:2019-01-15 10:47:36
【问题描述】:

我有一个DataFrame,其中包含 Alpha 2 国家/地区代码(UK、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_data 的代码时,索引用于创建一个新系列,其中 alpha['Name'] 在对应于 cube_data 的正确位置.

最终结果是:

cube_data
  Country Code    Name
0   UK  United Kingdom
1   ES           Spain
2   SL    Sierra Leone

肯定有更好的方法来做到这一点而无需循环吗?我看过series.isin()series.map() 但这些似乎不能提供我需要的结果。

这可以不用循环来完成吗?

【问题讨论】:

标签: python pandas


【解决方案1】:

你可以使用熊猫merge:

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

merge 的工作方式类似于 SQL 连接:这里我们将 alpha2cube_data 合并。我们使用来自alpha2'Code' 列和来自cube_data'Country Code' 列将两个数据帧合并在一起,并使用'inner' join 逻辑意味着只有两个数据帧中存在的值才会被保留。最后我们drop 来自alpha2 的列'Code' 包含与列'Country Code' 相同的值

【讨论】:

    【解决方案2】:

    在将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'}
    

    然后我们将其映射到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
    

    【讨论】:

      【解决方案3】:

      您查看过pycountry module 吗?

      我已将您的“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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        • 2018-07-08
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多