使用字典替换pandas Dataframe中的单词

时间:2018-02-16 10:36:19

标签: python-3.x pandas dictionary dataframe replace

我有一个pandas数据帧

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中的字典键替换为其值

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

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 个答案:

答案 0 :(得分:4)

<强>更新

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

RegEx说明:

'(\\b)word(\\b)' - 意味着搜索一个单词,在单词边界之前和之后,并将两个单词边界放在捕获组中:第一个专利 - 第一个捕获组等。

\\1 - 在替换部分中说放置第一个 cpaturing组的内容(在我们的例子中为单词边界)