Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 使用字典替换数据框中的单词_Python 3.x_Pandas_Dictionary_Dataframe_Replace - Fatal编程技术网

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