Python 3.x 使用字典替换数据框中的单词
我有一个熊猫数据框Python 3.x 使用字典替换数据框中的单词,python-3.x,pandas,dictionary,dataframe,replace,Python 3.x,Pandas,Dictionary,Dataframe,Replace,我有一个熊猫数据框 id text 1 acclrtr actn corr cr 2 plate corr aff 3 alrm alt 和字典 dict={'acclrtr':'accelerator','actn':'action','corr':'corrosion','cr':'chemical resistant','aff':'affinity','alrm':'alarm','alt':'alternate'} 我需要用它的值替换在dataframe中找到的字典键
id text
1 acclrtr actn corr cr
2 plate corr aff
3 alrm alt
和字典
dict={'acclrtr':'accelerator','actn':'action','corr':'corrosion','cr':'chemical resistant','aff':'affinity','alrm':'alarm','alt':'alternate'}
我需要用它的值替换在dataframe中找到的字典键
我尝试了以下代码,但没有一个工作正常
一,
二,
三,
四,
有人能告诉我,我哪里做错了,以及如何正确地用值替换键吗?更新:
In [108]: data
Out[108]:
id text
0 1 acclrtr actn corr cr
1 2 plate corr affinity # NOTE: `affinity`
2 3 alrm alt
In [109]: d2 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in d.items()}
In [110]: d2
Out[110]:
{'(\\b)acclrtr(\\b)': '\\1accelerator\\2',
'(\\b)actn(\\b)': '\\1action\\2',
'(\\b)aff(\\b)': '\\1affinity\\2',
'(\\b)alrm(\\b)': '\\1alarm\\2',
'(\\b)alt(\\b)': '\\1alternate\\2',
'(\\b)corr(\\b)': '\\1corrosion\\2',
'(\\b)cr(\\b)': '\\1chemical resistant\\2'}
In [111]: data['text'] = data['text'].replace(d2, regex=True)
In [112]: data
Out[112]:
id text
0 1 accelerator action corrosion chemical resistant
1 2 plate corrosion affinity
2 3 alarm alternate
其中d
-是一个替换词典
PS不要在变量名中使用(dict
,list
,等等)这样的保留字-它会隐藏内部Python类型,所以您赢了;我无法正确使用它们:
In [1]: dict = dict(a='aaa', b='bbb')
In [2]: dict
Out[2]: {'a': 'aaa', 'b': 'bbb'}
In [3]: dict2 = dict(c='ccc')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-650e1aa39edb> in <module>()
----> 1 dict2 = dict(c='ccc')
TypeError: 'dict' object is not callable
[1]中的:dict=dict(a='aaa',b='bbb')
在[2]中:dict
Out[2]:{'a':'aaa','b':'bbb'}
在[3]中:dict2=dict(c='ccc')
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1 dict2=dict(c='ccc')
TypeError:“dict”对象不可调用
正则表达式解释:
(\\b)单词(\\b)
-表示搜索一个单词,在单词边界之前和之后,并将两个单词边界放入捕获组:第一个专利论文-第一个捕获组,等等
\\1
-在替换部分中说,将第一个cpaturing组的内容放在那里(本例中为单词边界)谢谢MaxU的回答和建议..我不想要regex=True
,因为,如果我将第二行更改为plate corr affinity
,我将得到我不希望发生的输出plate corr affinity
。如果我设置了regex=False
,则不会发生替换。@RanjanaGirish,那么在这种情况下,您希望第二行发生什么?affinity一词应该保持原样,它不应该替换为affinityinity,因为它有键aff。@MaxU-我不擅长regex,可以添加do问题解释吗\b
是单词边界,但为什么需要\1
和\2
?@maxu,replace工作得很好,但它需要花费太多的时间来执行(对于2k大小的数据集,在我的4gb RAM系统中需要104.079149037437769s,是因为regex
),您能告诉我如何加快这个过程吗?
data['text']=data['text'].apply(lambda x: [item.replace(to_replace=dict) for item in x])
for key, value in dict.items():
data['text']=data['text'].apply(lambda x: list(set([item.replace(key,value) for item in x])))
In [108]: data
Out[108]:
id text
0 1 acclrtr actn corr cr
1 2 plate corr affinity # NOTE: `affinity`
2 3 alrm alt
In [109]: d2 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in d.items()}
In [110]: d2
Out[110]:
{'(\\b)acclrtr(\\b)': '\\1accelerator\\2',
'(\\b)actn(\\b)': '\\1action\\2',
'(\\b)aff(\\b)': '\\1affinity\\2',
'(\\b)alrm(\\b)': '\\1alarm\\2',
'(\\b)alt(\\b)': '\\1alternate\\2',
'(\\b)corr(\\b)': '\\1corrosion\\2',
'(\\b)cr(\\b)': '\\1chemical resistant\\2'}
In [111]: data['text'] = data['text'].replace(d2, regex=True)
In [112]: data
Out[112]:
id text
0 1 accelerator action corrosion chemical resistant
1 2 plate corrosion affinity
2 3 alarm alternate
In [1]: dict = dict(a='aaa', b='bbb')
In [2]: dict
Out[2]: {'a': 'aaa', 'b': 'bbb'}
In [3]: dict2 = dict(c='ccc')
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-3-650e1aa39edb> in <module>()
----> 1 dict2 = dict(c='ccc')
TypeError: 'dict' object is not callable