使用Python进行文本替换

时间:2018-06-05 11:28:49

标签: python pandas dictionary replace

我有两个数据集。一个包含文本描述,另一个包含包含两列from_valueto_value的表。

我们的想法是使用第二个数据集替换文本描述中所有出现的单词。

我可以从第二个数据集中识别出4种类型的单词:

  1. 简单的单词替换:RPLCD -> REPLACED
  2. 多字符串字替换:ALT BRK -> ALTERNATE BREAK
  3. 包含特殊字符的字词:A/C -> AIRCRAFT1-APU -> 1 APU
  4. 删除特殊字符:如果字符串中有%,我应删除它; -同样的事情,除非它在像1-APU这样的单词里面(我们替换整个单词)
  5. 我通过Gdrive上传了我的2个数据集的示例,这里是链接: https://drive.google.com/drive/folders/1HYFhKAqbYPIy0ekyj9xLSbk30YZwf8ZG?usp=sharing

    我的想法是首先将我的第二个数据集拆分为2个数据帧,一个包含多个单词,一个包含一个单词和特殊字符,或者拆分为3个数据帧,一个包含多个数据帧,一个包含独奏词,另一个包含特殊字符,并首先应用第一个数据帧,然后应用2sd,最后应用特殊字符删除,但它不起作用。

    你有办法管理这种类型的替换吗?

    这是我的代码:

    import sys
    import pyspark
    import pandas_datareader
    import re
    import csv
    import xlrd
    import pandas as pd
    import numpy as np
    import datetime
    
    
    from pyspark.context import SparkContext
    from pyspark.sql.functions import *
    from pandas import DataFrame
    from pandas_datareader import data, wb
    from pandas import *
    from xlrd import open_workbook
    
    ## 1)read the source table (OI and description)
    xls = ExcelFile("df1.xls")
    df = xls.parse(xls.sheet_names[0])
    
    ## 2)remove the nan values from df
    df = df.replace(np.nan, '')
    
    ## 3)read the subtitution table
    xls1 = ExcelFile("df2.xls")
    df1 = xls1.parse(xls1.sheet_names[0])
    df1.drop(df1.columns[0],inplace=True,axis=1)
    
    ## 4)separate the subtitution table into 2 datasets
    df3 = pd.DataFrame(columns=('FROM_VALUE', 'TO_VALUE'))
    df4 = pd.DataFrame(columns=('FROM_VALUE', 'TO_VALUE'))
    
    df5=[]
    df6=[]      
    
    for (idx, row) in df1.iterrows():
        if len(row.loc['FROM_VALUE'].split()) > 1: 
            df5.append([row.loc['FROM_VALUE'],row.loc['TO_VALUE']])
        else:
            df6.append([row.loc['FROM_VALUE'],row.loc['TO_VALUE']])
    
    df7= pd.DataFrame(df5)
    df7=df7.rename(columns = {0:'FROM_VALUE',1:'TO_VALUE'})
    df7 = df7.replace(np.nan, '', regex=True)
    df9 = Series(df7.TO_VALUE.values,index=df7.FROM_VALUE).to_dict()
    
    
    df8= pd.DataFrame(df6)
    df8=df8.rename(columns = {0:'FROM_VALUE',1:'TO_VALUE'})
    df8 = df8.replace(np.nan, '', regex=True)
    df10 = Series(df8.TO_VALUE.values,index=df8.FROM_VALUE).to_dict()
    
    
    ## 5)processing the description list based on the subtitution table
    df11 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in df9.items()}
    df12 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in df10.items()}
    
    df['WORK_PERFORMED_NEW'] = df['WORK_PERFORMED'].replace(df11, regex=True)
    df['WORK_PERFORMED_NV'] = df['WORK_PERFORMED_NEW'].replace(df12, regex=True)
    

1 个答案:

答案 0 :(得分:0)

我会将替换单词替换为特殊字符的替换,因为IMO需要循环遍历列表,特殊字符可以替换为一行。

所以给出了以下三个变量,其中df1是要处理的数据,df2是单词替换列表,unwanted_chars是用于过滤字符的正则表达式:

df1
Out: 
                                       WORK_PERFORMED
ID                                                   
1   WORD1 ! ? WORD2 <  : ) ALT WORD3 A/C DEFFRED W...
2   1-APU WORD2 ~ REPLACED % WORD3 @ DEF WORD4 ALT...
3                     WORD1 WORD2 ALT BRK WORD3 WORD4

df2
Out: 
       FROM_VALUE         TO_VALUE
ROW_ID                            
1             DEF         DEFERRED
2         DEFERED         DEFERRED
3         DEFFRED         DEFERRED
4           DEFRD         DEFERRED
5           DFR D         DEFERRED
6            DFRD         DEFERRED
7         DIFERED         DEFERRED
8         ALT BRK  ALTERNATE BREAK
9             ALT         ALTITUDE
10            A/C         AIRCRAFT
11          A/BRK        AUTOBRAKE
12            BRK            BREAK
13         1-FIRE           1 FIRE
14           1-HP  1 HIGH PRESSURE

unwanted_chars = re.compile('[^a-zA-Z0-9 ]+')

然后,您可以定义一个接受字符串作为输入的函数,然后遍历您的替换列表,检查每个尝试替换的条目。这是通过包含空格或字符串开头/结尾的正则表达式来完成的,这样就不会匹配单词的子字符串。在循环之后,单行用空格替换所有不需要的字符:

def subst(x):
    for fr, to in zip(df2.FROM_VALUE, df2.TO_VALUE):
        x = re.sub('((?<=^)|(?<= ))' + fr + '(?=$| )', to, x)
    x = re.sub(unwanted_chars, ' ', x)
    return x

准备好后,您只需将此功能映射到数据帧的列:

df1.WORK_PERFORMED.map(subst)
Out: 
ID
1    WORD1     WORD2        ALTITUDE WORD3 AIRCRAFT...
2    1 APU WORD2   REPLACED   WORD3   DEFERRED WORD...
3              WORD1 WORD2 ALTERNATE BREAK WORD3 WORD4
Name: WORK_PERFORMED, dtype: object