首页 > 解决方案 > 如果单元格值是另一个的子字符串,则熊猫标记两者

问题描述

具有简短和完整形式的人名的列,如果名称是另一个名称的一部分,我想统一它们。例如“James.J”和“James.Jones”,我想将它们都标记为“James.J”。

data = {'Name': ["Amelia.Smith",
"Lucas.M",
"James.J",
"Elijah.Brown",
"Amelia.S",
"James.Jones",
"Benjamin.Johnson"]}

df = pd.DataFrame(data)

我不知道如何在熊猫中做到这一点。所以只有一种 xlrd 方式,具有 SequenceMatcher 的相似度(并在 Excel 中手动排序):

import xlrd
from xlrd import open_workbook,cellname
import xlwt
from xlutils.copy import copy 

workbook = xlrd.open_workbook("C:\\TEM\\input.xlsx")

old_sheet = workbook.sheet_by_name("Sheet1")

from difflib import SequenceMatcher

wb = copy(workbook) 
sheet = wb.get_sheet(0) 

for row_index in range(0, old_sheet.nrows):

    current = old_sheet.cell(row_index, 0).value
    previous = old_sheet.cell(row_index-1, 0).value
    sro = SequenceMatcher(None, current.lower(), previous.lower(), autojunk=True).ratio()

    if sro > 0.7:
        sheet.write(row_index, 1, previous)
        sheet.write(row_index-1, 1, previous)

wb.save("C:\\TEM\\output.xls")

Pandas 有什么好的方法/谢谢。

在此处输入图像描述

标签: pandasdataframe

解决方案


使用 pandas,利用str.split.map一些布尔条件来识别骗子。

df1 = df['Name'].str.split('.',expand=True).rename(columns={0 : 'FName',  1 :'LName'})

df2 = df1.loc[df1['FName'].duplicated(keep=False)]\
     .assign(ky=df['Name'].str.len())\
     .sort_values('ky')\
     .drop_duplicates(subset=['FName'],keep='first').drop('ky',1)

df['NewName'] = df1['FName'].map(df2.assign(newName=df2.agg('.'.join,1))\
                             .set_index('FName')['newName'])



print(df)

               Name   NewName
0      Amelia.Smith  Amelia.S
1           Lucas.M       NaN
2           James.J   James.J
3      Elijah.Brown       NaN
4          Amelia.S  Amelia.S
5       James.Jones   James.J
6  Benjamin.Johnson       NaN

推荐阅读