首页 > 解决方案 > 使用 Pandas 列映射字典

问题描述

我有一个熊猫数据框列province,其中包含USA states and Canada province大写和小写的名称

df.province

输出

MANITOBA
Alberta
CA
OH

映射所有加拿大省值的字典

ca_provinces_dic = {
    'Newfoundland and Labrador': 'NL',
    'Prince Edward Island': 'PE',
    'Nova Scotia': 'NS',
    'New Brunswick': 'NB',
    'Quebec': 'QC',
    'Ontario': 'ON',
    'Manitoba': 'MB',
    'Saskatchewan': 'SK',
    'Alberta': 'AB',
    'British Columbia': 'BC',
    'Yukon': 'YT',
    'Northwest Territories': 'NT',
    'Nunavut': 'NU',
}

如何province使用处理问题的 pandas 将所有值映射到它们各自的短格式case matching

例如 - 我想将所有province column values(小写)与所有dictionary keys(小写)进行比较,并根据匹配项,我将为省列值应用适当的简短形式(仅在适用的情况下)


我目前对这个问题的尝试。

canada_provinces_dic = {
    'Newfoundland and Labrador': 'NL',
    'Prince Edward Island': 'PE',
    'Nova Scotia': 'NS',
    'New Brunswick': 'NB',
    'Quebec': 'QC',
    'Ontario': 'ON',
    'Manitoba': 'MB',
    'Saskatchewan': 'SK',
    'Alberta': 'AB',
    'British Columbia': 'BC',
    'Yukon': 'YT',
    'Northwest Territories': 'NT',
    'Nunavut': 'NU',
}


def handle_state(data_attr):
  for k, v in canada_provinces_dic.items():
      if data_attr.strip().lower() == k.lower():
        return canada_provinces_dic[k]
  else:
    return data_attr
df['state'] =  df.state.apply(handle_state)

标签: pythonpython-3.xpandasdataframedictionary

解决方案


使用Series.mapSeries.fillna

首先将您的 dict 转换为小写的键:

In [638]: ca_provinces_dic = {k.lower():v for k,v in ca_provinces_dic.items()}

In [659]: df['province'] = df['province'].str.lower().map(ca_province_dict).fillna(df['province'])

In [660]: df
Out[660]: 
  province
0       MB
1       AB
2       CA
3       OH

推荐阅读