使用字典替换熊猫数据框中的单词
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 不要对变量名使用保留字(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
正则表达式解释:
'(\\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
? 可以你告诉我怎样才能加快这个过程?以上是关于使用字典替换熊猫数据框中的单词的主要内容,如果未能解决你的问题,请参考以下文章