用字典的值替换字符串
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 . 感谢您的帮助!我希望我能给两张已答复的支票。以上是关于用字典的值替换字符串的主要内容,如果未能解决你的问题,请参考以下文章