一个包含人名的完整和简短形式的列,我想统一它们,如果名字是另一个名字的一部分。例如,“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)
我不知道如何在Pandas中做到这一点。所以只有一个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的好方法是什么?
2条答案
按热度按时间lg40wkob1#
使用Pandas,利用
str.split
和.map
以及一些布尔条件来识别复制品。nhhxz33t2#
这是一个使用
apply
和自定义函数的例子,对于小的dfs来说应该没问题;这对于大的dfs不是很好的扩展。2一个更复杂的memo
数据结构是一个不错的地方,可以在不降低可读性的前提下提高性能:输出: