用字典的值替换字符串

Posted

技术标签:

【中文标题】用字典的值替换字符串【英文标题】:Replace String with Value of Dictionary 【发布时间】:2017-07-15 18:24:07 【问题描述】:

我会尽量简化。我有一个按州列出企业列表的 DataFrame。有些州是缩写的,有些不是。我想用缩写替换完整的州名(例如:新泽西州到新泽西州)。

我发现here 找到了一个很酷的模块“US”,它在字典中列出了所有州及其缩写。我想做的是用缩写替换全名。

代码:

import pandas as pd
import numpy as np
import us
dfp = pd.DataFrame('A' : [np.NaN,np.NaN,3,4,5,5,3,1,5,np.NaN], 
                    'B' : [1,0,3,5,0,0,np.NaN,9,0,0], 
                    'C' : ['Pharmacy of Oklahoma','NY Pharma','NJ Pharmacy','Idaho Rx','CA Herbals','Florida Pharma','AK RX','Ohio Drugs','PA Rx','USA Pharma'], 
                    'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN],
                    'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',])
print(dfp)

statez = us.states.mapping('abbr', 'name')
lst_of_abbrv = statez.keys()
lst_of_states = statez.values()

phrase = "Pharmacy of Oklahoma"

for x in phrase.split():
    if x in lst_of_states:
        x= x.replace(x, 'State')
        print(phrase.split())

现在我唯一能做的就是使用字符串并将其替换为单词“State”。如何用字典中的缩写替换名称?我已经尝试过并想要类似x= x.replace(x, lst_of_abbrv) 但它会出错,因为您显然不能用 dict_keys 替换。

如果您能够解释如何将其应用于数据框的“C”列,则加分

【问题讨论】:

x = x.replace(x, statez[x])? 不要将键和值分开到不同的列表中。只需检查if x in statez @BallpointBen 那是我第一次去,但我得到一个 KeyError。 KeyError: 'Oklahoma' 在我上面的具体示例中 if x in lst_of_abbrv:替换if x in lst_of_states: 另外,您不会看到 phrase 中反映的更改...您可以谷歌搜索原因。但要修复它,请执行L = phrase.split()for (i,x) in enumerate(L): 然后L[i] = x.replace(x, statez[x])。然后,打印 L 而不是 phrase.split() 【参考方案1】:

首先,我将定义一个函数,该函数将替换字符串中状态的全名(如果存在)或返回原始字符串。

def replace_states(company):
    # find all states that exist in the string
    state_found = filter(lambda state: state in company, statez.keys())

    # replace each state with its abbreviation
    for state in state_found:
        company = company.replace(state, statez[state])
    # return the modified string (or original if no states were found)
    return company

然后您可以将此函数应用于数据框的整个列

dfp['C'] = dfp['C'].map(replace_states)

【讨论】:

这正是我想要的。我将更多地研究您用于解决此解决方案的步骤(主要是 .map 和使用 lambda。如果我能给您带来麻烦,您是否有任何文档或链接可供我学习? @MattR pandas 映射到数据框列/系列pandas.pydata.org/pandas-docs/stable/…。 SO与lambda使用有关的问题***.com/questions/890128/… 感谢这些链接!我想我理解.map()。但是你的 lambda 函数仍然让我失望……我不明白它是如何工作的;特别是lambda state: state in company。用勺子喂我不是你的工作,但如果你有时间,我会非常感谢任何帮助 lambda 定义了一个未命名的函数,它接受一个参数state 并返回语句state in company 的布尔值。这可以等效地写成类似def f(state): return state in company 的函数 statez = us.states.mapping('name', 'abbr') 你应该被设置【参考方案2】:

这里是完整的解决方案:

# Note the difference here
statez = us.states.mapping('name', 'abbr')
lst_of_states = statez.keys()
lst_of_abbrv = statez.values()

def sentence_with_states_abbreviated(phrase):
    words = phrase.split()
    for (i,word) in enumerate(words):
        if word in lst_of_states:
            words[i] = statez[word]
    return ' '.join(words)

dfp['C'] = dfp['C'].apply(sentence_with_states_abbreviated)

【讨论】:

@MattR:要完成解决方案,您需要使用 ' '.join(words) 将单词重新加入到短语中,然后将其放入列 C . 感谢您的帮助!我希望我能给两张已答复的支票。

以上是关于用字典的值替换字符串的主要内容,如果未能解决你的问题,请参考以下文章

Python - 从键替换特殊字符,字典中的值

用字典值替换 Pandas Dataframe 中的部分字符串

用字典替换子字符串的最快方法(在大型数据集上)

用多个字典值替换字符串中的单词?

使用字典替换 Pandas 列中字符串中的字符串

用字典替换熊猫系列中的值