pandas - 如果单元格值是另一个的子字符串,则熊猫标记两者
问题描述
具有简短和完整形式的人名的列,如果名称是另一个名称的一部分,我想统一它们。例如“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 有什么好的方法/谢谢。
解决方案
使用 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
推荐阅读
- ios - 如何在swift 4中获取数组索引的整数?
- jquery - Jquery在数组中获取HTML表格列的文本
- powerbi - Power BI - 根据条件从文本字符串中提取数字
- javascript - 自定义 Vue 下拉菜单保持焦点
- vba - 如何将 MAX 与 .FIND 一起使用?在 VBA (Excel) 中
- c# - 生成嵌套在字典中的二维数字数组
- php - 树莓派/PHP + Arduino 串行通信
- angular - 在 Angular Material MatSortable 中禁用第三种状态
- opengl - OpenGL 帧缓冲区缺失面
- python - Django模板:无法将int和字符串从路径传递到视图