【问题标题】:Text substitution using Python使用 Python 进行文本替换
【发布时间】:2018-11-14 21:00:16
【问题描述】:

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

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

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

  1. 简单的单词替换:RPLCD -> REPLACED
  2. 多串词替换:ALT BRK -> ALTERNATE BREAK
  3. 带有特殊字符的单词:A/C -> AIRCRAFT1-APU -> 1 APU
  4. 特殊字符删除:如果字符串中有%,我应该删除它; - 也一样,除非它在像 1-APU 这样的单词中(我们替换整个单词)

我通过 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)

【问题讨论】:

  • 请提供不需要从谷歌驱动器下载数据集的Minimal, Complete, and Verifiable example
  • import pandas as pd; from pandas import DataFrame; from pandas import * 和后来的df3 = pd.DataFrame 迟早你会后悔的
  • @bobrobbob 不明白你的回复!!!
  • @Mouad 只需使用:import pandas as pd
  • @OferSadan 这是一个替代表数据集的示例: id From value -> to value A/C -> Aircraft, 1-B -> 1 B, "%" -> "" , BRK -> 刹车,ALT BRK -> 备用刹车

标签: python pandas dictionary replace


【解决方案1】:

我会将单词替换与特殊字符替换分开,因为 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 2021-09-25
    • 2018-10-17
    • 1970-01-01
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多