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

2024-05-08 19:26:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有很多调查结果数据,有一个专栏问用户来自哪个州。例如,有些人写“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

有些人打“弗吉尼亚”,有些人写“弗吉尼亚”。我只想要缩写版本。你知道吗


Tags: 数据用户map字典地图事情建议survey
2条回答

如果确实无法验证用户输入前端,则可以轻松使用字典的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

假设您的数据帧如下所示:

>>> 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

正如评论中所建议的,毫无疑问,有一些库是专门为您构建更完整的映射的,考虑到常见的拼写错误和小的语法差异,例如“D.C.”和“DC.”

相关问题 更多 >