繁体   English   中英

如何使用字典映射在Python中标准化名称?

[英]How can I standardize names in Python using a dictionary map?

我有很多调查结果数据,其中一栏询问用户来自哪个州。 例如,有些人写了“ VA”,另一些人写了“ Virginia”

我本来希望使用词典地图,但是事情进展得不太顺利。 有人对我有什么建议吗? 我对Python还是比较陌生,因此我仍在尝试摆脱困境。

这是我尝试过的:

abv = {"Virginia": "VA", "Maryland": "MD",
      "West Virginia": "WV", "Pennsylvania": "PA"}
abv2 = dict(map(reversed, abv.items()))
survey['New State'] = survey.State.map(abv2)
survey

有些人输入“ Virginia”,其他人输入“ VA”。 我只想要缩写版本。

假设您的DataFrame如下所示:

>>> import pandas as pd                                                         
>>> survey = pd.DataFrame( 
...     ["Virginia", "VA", "VA", "Penns.", "PA", "Pennsylvania"], 
...     columns=["State"] 
... )                                                                           
>>> survey                                                                      
          State
0      Virginia
1            VA
2            VA
3        Penns.
4            PA
5  Pennsylvania

您构造的初始映射可以是长格式名称到规范缩写的映射。

>>> to_abbrev = { 
...     "Virginia": "VA", 
...     "Pennsylvania": "PA", 
...     "Penns.": "PA", 
... }

然后,使用缩写词本身进行更新:

>>> to_abbrev.update({v: v for v in to_abbrev.values()})          
>>> to_abbrev                                                                                                                                                                                                                                                
{'Virginia': 'VA',
 'Pennsylvania': 'PA',
 'Penns.': 'PA',
 'VA': 'VA',
 'PA': 'PA'}

最后,调用.map()获得结果:

>>> survey["State"].map(to_abbrev)                                                                                                                                                                                                                           
0    VA
1    VA
2    VA
3    PA
4    PA
5    PA
Name: State, dtype: object

值得说明的是半显而易见的:您的to_abbrev必须是完整的映射; 否则,缺失值将为NaN:

>>> survey.append({"State": "Wisconsin"}, ignore_index=True)["State"].map(to_abbrev)                                                                                                                                                                         
0     VA
1     VA
2     VA
3     PA
4     PA
5     PA
6    NaN
Name: State, dtype: object

正如评论中所建议的,毫无疑问,这里有一些库旨在为您建立更全面的映射关系,同时考虑诸如常见的错别字和小的语法差异(例如“ DC”与“ DC”)。

如果您确实无法验证用户输入的前端,则可以轻松使用字典的get方法,并提供默认值作为后备:

def fix(user_input):
    mapping = {"Virginia": "VA", "Maryland": "MD",
               "West Virginia": "WV", "Pennsylvania": "PA"}

    return mapping.get(user_input, user_input)

print(fix("Virginia"))  # >> VA
print(fix("VA"))  # >> VA

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM