python - 如何删除具有相同列特征值的行以使一行保留已删除行的另一个特征的所有值?
问题描述
我有一组房地产广告数据。有几行是关于相同的房地产,所以它充满了不完全相同的重复。它看起来像这样:
ID URL CRAWL_SOURCE PROPERTY_TYPE NEW_BUILD DESCRIPTION IMAGES SURFACE LAND_SURFACE BALCONY_SURFACE ... DEALER_NAME DEALER_TYPE CITY_ID CITY ZIP_CODE DEPT_CODE PUBLICATION_START_DATE PUBLICATION_END_DATE LAST_CRAWL_DATE LAST_PRICE_DECREASE_DATE
0 22c05930-0eb5-11e7-b53d-bbead8ba43fe http://www.avendrealouer.fr/location/levallois... A_VENDRE_A_LOUER APARTMENT False Au rez de chaussée d'un bel immeuble récent,... ["https://cf-medias.avendrealouer.fr/image/_87... 72.0 NaN NaN ... Lamirand Et Associes AGENCY 54178039 Levallois-Perret 92300.0 92 2017-03-22T04:07:56.095 NaN 2017-04-21T18:52:35.733 NaN
1 8d092fa0-bb99-11e8-a7c9-852783b5a69d https://www.bienici.com/annonce/ag440414-16547... BIEN_ICI APARTMENT False Je vous propose un appartement dans la rue Col... ["http://photos.ubiflow.net/440414/165474561/p... 48.0 NaN NaN ... Proprietes Privees MANDATARY 54178039 Levallois-Perret 92300.0 92 2018-09-18T11:04:44.461 NaN 2019-06-06T10:08:10.89 2018-09-25
我想删除太相似而不能重复的行,只保留一个保留和收集CRAWL_SOURCE
已删除行的行。例如,假设CRAWL_SOURCE
如果描述或大多数图像相似,我想保留一行。到目前为止,我只找到了一种方法来创建一个新列来说明描述何时相同:
df['is_duplicated'] = df.duplicated(['DESCRIPTION'])
或者当图像相同时:
def image_similarity(imageAurls,imageBurls):
imageAurls = ast.literal_eval(imageAurls)
imageBurls = ast.literal_eval(imageBurls)
for urlA in imageAurls:
responseA = requests.get(urlA)
imgA = Image.open(BytesIO(responseA.content))
print(imgA)
for urlB in imageBurls:
responseB = requests.get(urlB)
imgB = Image.open(BytesIO(responseB.content))
hash0 = imagehash.average_hash(imgA)
hash1 = imagehash.average_hash(imgB)
cutoff = 5
if hash0 - hash1 < cutoff:
print(urlA)
print(urlB)
return('similar')
return('not similar')
df['NextImage'] = df['IMAGES'][df['IMAGES'].index - 1]
df['IsSimilar'] = df.apply(lambda x: image_similarity(x['IMAGES'], x['NextImage']), axis=1)
因此,如何删除共享相同描述的行,或共享相同照片的行,并制作一个收集CRAWL_SOURCE
已删除行的行?
一般来说:如何删除共享同一列特征值的行以使一行收集另一列特征的所有值?
注意:如果您对发现可能相同的房屋有任何其他想法,我将很高兴听到他们的声音。如果以下功能相似,我认为两行可能在谈论相同的房地产:
SURFACE LAND_SURFACE BALCONY_SURFACE TERRACE_SURFACE ROOM_COUNT BEDROOM_COUNT BATHROOM_COUNT LUNCHROOM_COUNT TOILET_COUNT FURNISHED FIREPLACE AIR_CONDITIONING GARDEN SWIMMING_POOL BALCONY TERRACE CELLAR PARKING PARKING_COUNT HEATING_TYPES HEATING_MODE FLOOR FLOOR_COUNT CONSTRUCTION_YEAR ELEVATOR CARETAKER ENERGY_CONSUMPTION GREENHOUSE_GAS_CONSUMPTION MARKETING_TYPE PRICE PRICE_M2
解决方案
您正在寻找的是一种记录链接方法,它已经完成了。我建议您使用一个使用单词距离计算和体面文档来检测相似性的库:Python Record Linkage Toolkit。
导入库后,您必须索引要比较的源,如下所示:
indexer = recordlinkage.Index()
#using url as intersection
indexer.block('url')
candidate_links = indexer.index(df_a, df_b)
c = recordlinkage.Compare()
假设您想根据字符串的相似性进行比较,但它们并不完全匹配:
c.string('descriptionA', 'descriptionB', method='jarowinkler', threshold=0.85)
如果你想要一个完全匹配,你应该使用:
c.exact('imageUrl')
无论如何,基于 Record Linkage 的资源(库)更多。