使用字典替换熊猫数据框中的单词

Posted

技术标签:

【中文标题】使用字典替换熊猫数据框中的单词【英文标题】:Replace words in pandas Dataframe using dictionary 【发布时间】:2018-07-27 06:02:27 【问题描述】:

我有一个熊猫数据框

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'

我需要用它的值替换在数据框中找到的字典键

我尝试了以下代码,但没有一个能正常工作

1.

data['text']=data['text'].str.replace(dict.keys(), dict.values())

2.

data['text']=data['text'].replace(dict, inplace=True)

3.

data['text']=data['text'].apply(lambda x: [item.replace(to_replace=dict) for item in x])

4.

for key, value in dict.items():
    data['text']=data['text'].apply(lambda x: list(set([item.replace(key,value) for item in x])))

谁能告诉我,我在哪里做错了以及如何正确地用值替换键?

【问题讨论】:

【参考方案1】:

更新:

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 不要对变量名使用保留字(dictlist 等) - 它会影响 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

正则表达式解释:

'(\\b)word(\\b)' - 表示搜索一个词,前后是一个词边界,并将两个词边界放在捕获组中:第一个专利 - 第一个捕获组,等等。

\\1 - 在替换部分说把 first cpaturing group 的内容(在我们的例子中是单词边界)放在那里

【讨论】:

感谢 MaxU 的回答和建议。我不想要 regex=True,因为如果我将第二行更改为 plate corr affinity,我将得到输出 plate corrosion affinityinity,这是我不想发生的。如果我设置regex=False,则不会发生替换。 @RanjanaGirish,那么在这种情况下,您希望第二行发生什么? 单词 affinity 应该保持原样,它不应该替换为 affinityinity 因为它有键 aff在里面。 @MaxU - 我不擅长正则表达式,你能添加做问题解释吗? \b 是单词边界,但为什么需要 \1\2 @maxu,replace 运行良好,但执行时间过长(对于 2k 大小的数据集,在我的 4gb RAM 系统中需要 104.07914903743769s,是因为 regex? 可以你告诉我怎样才能加快这个过程?

以上是关于使用字典替换熊猫数据框中的单词的主要内容,如果未能解决你的问题,请参考以下文章

从熊猫数据框中的单词中删除子字符串

熊猫数据框中的字典列

替换熊猫数据框中的列表元素

如何用熊猫数据框中的范围替换列值

在熊猫数据框中使用正则表达式替换列值

Python - 替换熊猫数据框中的负无穷大值[重复]