python - 根据条件在一个数据帧中拆分并替换为 pandas 中的另一个数据帧

标签 python pandas dataframe replace split

我有两个数据框,都包含 sql 表。

这是我的第一个数据框

Original_Input           Cleansed_Input        Core_Input    Type_input
TECHNOLOGIES S.A         TECHNOLOGIES SA        
A & J INDUSTRIES, LLC    A J INDUSTRIES LLC     
A&S DENTAL SERVICES      AS DENTAL SERVICES     
A.M.G Médicale Inc       AMG Mdicale Inc        
AAREN SCIENTIFIC         AAREN SCIENTIFIC   

我的第二个数据框是:

Name_Extension     Company_Type     Priority
co llc             Company LLC       2
Pvt ltd            Private Limited   8
Corp               Corporation       4
CO Ltd             Company Limited   3
inc                Incorporated      5
CO                 Company           1

我删除了标点符号、ASCII 和数字,并将这些数据放入 df1cleansed_input 列中。

需要使用 df2Name_Extension 列检查 df1 中的 cleansed_input 列。如果 cleansed_input 中的值末尾有 Name_Extension 中的任何值,则应将其拆分并放入 df1< 的 type_input 列 不仅如此,而且是缩写的。

例如,如果 cleansed_column 中存在 CO,则应将其缩写为 Company 并放入 type_input 列 其余文本应位于 df1core_type 列中。另外还有优先级,我不确定是否需要。

预期输出:

Original_Input          Cleansed_Input        Core_Input       Type_input
TECHNOLOGIES S.A        TECHNOLOGIES SA       TECHNOLOGIES      SA
A & J INDUSTRIES, LLC   A J INDUSTRIES LLC    A J INDUSTRIES    LLC
A&S DENTAL SERVICES     AS DENTAL SERVICES      
A.M.G Médicale Inc      AMG Mdicale Inc       AMG Mdicale       Incorporated
AAREN SCIENTIFIC        AAREN SCIENTIFIC        

我尝试了很多方法,比如 isin、mask、contains 等,但不知道该把什么放在哪里。

我收到一条错误消息:“系列是可变的,它们无法进行哈希处理”。当我尝试使用数据框时,我不确定为什么会出现该错误。

我没有该代码,并且正在使用 jupiter 笔记本和 sql server,isin 似乎在 jupiter 中不起作用。

同样的方式还有另一个分割要做。要拆分为parent_compnay 名称和别名的original_input 列。

Here is my code:

import pyodbc
import pandas as pd
import string
from string import digits
import sqlalchemy
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.types import String
from io import StringIO
from itertools import chain
import re

#Connecting SQL with Python

server = '172.16.15.9'
database = 'Database Demo'
username = '**'
password = '******'


engine = create_engine('mssql+pyodbc://**:******@'+server+'/'+database+'? 
driver=SQL+server')

#Reading SQL table and grouping by columns
data=pd.read_sql('select * from [dbo].[TempCompanyName]',engine)
#df1=pd.read_sql('Select * from company_Extension',engine)
#print(df1)
#gp = df.groupby(["CustomerName", "Quantity"]).size() 
#print(gp)

#1.Removing ASCII characters
data['Cleansed_Input'] = data['Original_Input'].apply(lambda x:''.join(['' 
if ord(i) < 32 or ord(i) > 126 else i for i in x]))

#2.Removing punctuations
data['Cleansed_Input']= data['Cleansed_Input'].apply(lambda 
x:''.join([x.translate(str.maketrans('', '', string.punctuation))]))
#df['Cleansed_Input'] = df['Cleansed_Input'].apply(lambda x:''.join([i for i 
in x if i not in string.punctuation]))

#3.Removing numbers in a table.
data['Cleansed_Input']= data['Cleansed_Input'].apply(lambda 
x:x.translate(str.maketrans('', '', string.digits)))
#df['Cleansed_Input'] = df['Cleansed_Input'].apply(lambda x:''.join([i for i 
in x if i not in string.digits]))

#4.Removing trialing and leading spaces 
data['Cleansed_Input']=df['Cleansed_Input'].apply(lambda x: x.strip())

df=pd.DataFrame(data)
#data1=pd.DataFrame(df1)


df2 = pd.DataFrame({ 
"Name_Extension": ["llc",
                   "Pvt ltd",
                   "Corp",
                   "CO Ltd",
                   "inc", 
                   "CO",
                   "SA"],
"Company_Type": ["Company LLC",
                 "Private Limited",
                 "Corporation",
                 "Company Limited",
                 "Incorporated",
                 "Company",
                 "Anonymous Company"],
"Priority": [2, 8, 4, 3, 5, 1, 9]
})

data.to_sql('TempCompanyName', con=engine, if_exists='replace',index= False)

最佳答案

IIUC,我们可以使用一些基本的正则表达式:

首先,我们删除所有尾随和前导空格并按空格分割,这将返回一个列表列表,我们可以使用chain.from_iterable

然后我们使用一些带有 pandas 方法 str.findallstr.contains 的正则表达式来匹配您的输入。

from itertools import chain

ext = df2['Name_Extension'].str.strip().str.split('\s+')

ext = list(chain.from_iterable(i for i in ext))

df['Type_Input'] = df['Cleansed_Input'].str.findall('|'.join(ext),flags=re.IGNORECASE).str[0]

s = df['Cleansed_Input'].str.replace('|'.join(ext),'',regex=True,case=False).str.strip()

df.loc[df['Type_Input'].isnull()==False,'Core_Input'] = s
<小时/>

打印(df)

          Original_Input      Cleansed_Input type_input      core_input
0       TECHNOLOGIES S.A     TECHNOLOGIES SA        NaN             NaN
1  A & J INDUSTRIES, LLC  A J INDUSTRIES LLC        LLC  A J INDUSTRIES
2    A&S DENTAL SERVICES  AS DENTAL SERVICES        NaN             NaN
3     A.M.G Médicale Inc     AMG Mdicale Inc        Inc     AMG Mdicale
4       AAREN SCIENTIFIC    AAREN SCIENTIFIC        NaN             NaN

关于python - 根据条件在一个数据帧中拆分并替换为 pandas 中的另一个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59680268/

相关文章:

python - Pandas :对多列进行逐行操作

r - 将每个数据框行文本分成五个均匀的文本 block

python - IF 语句 Pandas Dataframe : The truth value of a Series is ambiguous

python - 没有名为 yaml 的模块(brew 再次破坏了我的 python)

python - 已验证用户的 prefetch_related

python - 使用Python进行数据检索和查询Elasticsearch

python - 将列添加到包含跨行的复杂逻辑的 Python pandas 数据框中

python - 减去 pandas 数据框,同时保留一些列完好无损

r - 按名称删除数据框列

python - pandas read_csv 按列索引(不是名称)设置 `dtype`