【问题标题】: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])))

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

【问题讨论】:

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


    【解决方案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? 可以你告诉我怎样才能加快这个过程?
    猜你喜欢
    • 2018-07-24
    • 2017-12-28
    • 1970-01-01
    • 2019-01-25
    • 1970-01-01
    • 2019-07-18
    • 2019-10-22
    • 2022-01-11
    • 2017-09-04
    相关资源
    最近更新 更多