У меня есть два набора данных.Один содержит текстовое описание, а другой - таблицу с двумя столбцами from_value
и to_value
.
Идея состоит в том, чтобы заменить все вхождения слова в текстовом описании, используя второй набор данных.
Я могу определить 4 типа слов из этого второго набора данных:
- Простая подстановка слов:
RPLCD -> REPLACED
- Многострочная подстановка слов:
ALT BRK -> ALTERNATE BREAK
- Слова со специальными символами в них:
A/C -> AIRCRAFT
или 1-APU -> 1 APU
- Удаление специальных символов: если у меня есть
%
в строке, я должен удалить ее;то же самое для -
, если только оно не находится внутри слова, подобного 1-APU
(мы заменяем целое слово)
Я загрузил пример моих двух наборов данных через Gdrive, вот ссылка: 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)